Opened 9 years ago
Last modified 9 years ago
#25702 closed New feature
Port ModelAdmin.fieldset to BaseForm — at Version 1
Reported by: | Laurent Peuch | Owned by: | nobody |
---|---|---|---|
Component: | Forms | Version: | dev |
Severity: | Normal | Keywords: | form modeladmin layout admininterface |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
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):
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:
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 (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.
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:
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"), }), )
(1) http://django-crispy-forms.readthedocs.org/en/latest/layouts.html