mixins on ModelForms
|Reported by:||EvilDMP||Owned by:||loic84|
|Has patch:||yes||Needs documentation:||no|
|Needs tests:||no||Patch needs improvement:||no|
At present, this sort of thing is not possible:
# define a reusable mixin for ModelForms InputURLMixin(object): input_url = forms.CharField(max_length=255, required = False, help_text=u"<strong>External URL</strong> not found above? Enter a new one.", ) # the form class LinkItemForm(InputURLMixin, forms.ModelForm): [...] # the admin class class PluginInlineLink(admin.StackedInline): form = LinkItemForm [...] fieldsets = # if fieldsets contains "input_url": "Unknown field(s) (input_url) specified"
In other words, it's not possible for a ModelForm to inherit from a Mixin(object) or indeed Mixin(Form).
In the former case, the Mixin(object) fails the test in forms.ModelFormMetaclass.__new__() that would allow it to be treated as a parent worth inheriting from, so the attributes set on it are ignored when the subclass is created.
In the latter case, the metaclasses conflict in ways I don't fully understand. The docs https://docs.djangoproject.com/en/dev//topics/forms/modelforms/#form-inheritance simply remark "For technical reasons, a subclass cannot inherit from both a ModelForm and a Form simultaneously".
It doesn't seem possible to give the putative mixin class the metaclasses it needs manually to solve this (e.g. __metaclass__ = DeclarativeFieldsMetaclass or __metaclass__ = ModelFormMetaclass.
One solution might be to provide a FormMixin base class for mixins to inherit from.
Another might be to make forms.ModelFormMetaclass.__new__() less discriminating, and allow get_declared_fields() to look at attributes of classes that are not only ModelForms.
Change History (7)
comment:1 Changed 13 months ago by anonymous
- Component changed from Uncategorized to Forms
- Needs documentation unset
- Needs tests unset
- Patch needs improvement unset
- Triage Stage changed from Unreviewed to Design decision needed
- Type changed from Uncategorized to New feature
comment:2 Changed 12 months ago by aaugustin
- Triage Stage changed from Design decision needed to Accepted
comment:3 Changed 8 months ago by loic84
- Has patch set
- Owner changed from nobody to loic84
- Status changed from new to assigned
- Version changed from 1.4 to master
comment:6 Changed 5 months ago by Loic Bistuer <loic.bistuer@…>
- Resolution set to fixed
- Status changed from assigned to closed