[Django] #25702: Port ModelAdmin.fieldset to BaseForm

7 views
Skip to first unread message

Django

unread,
Nov 7, 2015, 11:15:22 AM11/7/15
to django-...@googlegroups.com
#25702: Port ModelAdmin.fieldset to BaseForm
-------------------------+-------------------------------------------------
Reporter: | Owner: nobody
Psycojoker |
Type: New | Status: new
feature |
Component: Forms | Version: master
Severity: Normal | Keywords: form modeladmin layout
Triage Stage: | admininterface
Unreviewed | Has patch: 0
Easy pickings: 0 | UI/UX: 0
-------------------------+-------------------------------------------------
In the admin interface it is possible to control the admin forms layout
using the //fieldset// attribute. This feature is described here:
https://docs.djangoproject.com/en/1.8/ref/contrib/admin/#django.contrib.admin.ModelAdmin.fieldsets

Here is the example from the documentation (modified to display the
feature that allows to display multiple fields in the same line):

{{{#!python
from django.contrib import admin

class FlatPageAdmin(admin.ModelAdmin):
fieldsets = (
(None, {
'fields': (('url', 'title'), ('content', 'sites'))
}),
('Advanced options', {
'classes': ('collapse',),
'fields': ('enable_comments', 'registration_required',
'template_name')
}),
)
}}}

The idea of this feature would be to port this exact behavior to the
standard django forms. Taking the first form example from the
documentation, this could look like this:

{{{#!python
from django import forms

class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
message = forms.CharField(widget=forms.Textarea)
sender = forms.EmailField()
cc_myself = forms.BooleanField(required=False)

fieldset = (
(None, {
"fields": (('sender', 'cc_myself'),),
}),
("Content", {
"fields": ("subject", "message"),
}),
)
}}}

Currently, there is no way to modify the form layout beside the field
order. This is very frustrating because this mean that if you want modify
the layout of a form, you need to explode it totally to do that or you
need to use another project (like django-crispy-forms [#point1 (1)] or
another one).

While not going to all the extend of what django-cripsy-forms or another
project is doing, //fieldset// is an already known and used convention
accross the django project and allowing it in standard forms seems like a
natural and intuitive choice.

[=#point1 (1)] http://django-crispy-
forms.readthedocs.org/en/latest/layouts.html

--
Ticket URL: <https://code.djangoproject.com/ticket/25702>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

Django

unread,
Nov 7, 2015, 11:32:44 AM11/7/15
to django-...@googlegroups.com
#25702: Port ModelAdmin.fieldset to BaseForm
-------------------------------------+-------------------------------------
Reporter: Psycojoker | Owner: nobody
Type: New feature | Status: new
Component: Forms | Version: master
Severity: Normal | Resolution:
Keywords: form modeladmin | Triage Stage:
layout admininterface | Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by Psycojoker):

* needs_better_patch: => 0
* needs_tests: => 0
* needs_docs: => 0


Old description:

New description:

Regarding the API, I'm wondering if puting the //fieldset// attribute in
the //Meta// class doesn't make more sens since it is already used (only
for the //ModelForm//?) to specify options and this will avoid a conflict
with currently existing fields named //fieldset//.

This would look like this:

{{{#!python
from django import forms

class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
message = forms.CharField(widget=forms.Textarea)
sender = forms.EmailField()
cc_myself = forms.BooleanField(required=False)

class Meta:


fieldset = (
(None, {
"fields": (('sender', 'cc_myself'),),
}),
("Content", {
"fields": ("subject", "message"),
}),
)
}}}

[=#point1 (1)] http://django-crispy-
forms.readthedocs.org/en/latest/layouts.html

--

--
Ticket URL: <https://code.djangoproject.com/ticket/25702#comment:1>

Django

unread,
Nov 7, 2015, 2:44:19 PM11/7/15
to django-...@googlegroups.com
#25702: Port ModelAdmin.fieldset to BaseForm
-------------------------------------+-------------------------------------
Reporter: Psycojoker | Owner: nobody
Type: New feature | Status: closed
Component: Forms | Version: master
Severity: Normal | Resolution: duplicate

Keywords: form modeladmin | Triage Stage:
layout admininterface | Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0

Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by charettes):

* status: new => closed
* resolution: => duplicate


Comment:

This looks like a duplicate of #6630. I have to say I agree with Carl that
formsets are too much display logic in Python.

They make a bit more sense at the admin level since you want a quick an
dirty way to order your fields without having to write a template.

In the case of forms efforts have been made to move the whole logic to the
template level and eventually deprecate the `as_(p|table|ul)` methods
which are the only methods that would rely on this option.

If you disagree with these ticket resolutions please voice your opinion on
the developer mailing list. In the meanwhile I'll just mark this ticket as
a duplicate.

--
Ticket URL: <https://code.djangoproject.com/ticket/25702#comment:2>

Reply all
Reply to author
Forward
0 new messages