#19617: mixins on ModelForms
-------------------------------+--------------------
Reporter: EvilDMP | Owner: nobody
Type: Uncategorized | Status: new
Component: Uncategorized | Version: 1.4
Severity: Normal | Keywords:
Triage Stage: Unreviewed | Has patch: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------+--------------------
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.
--
Ticket URL: <https://code.djangoproject.com/ticket/19617>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit https://groups.google.com/groups/opt_out.