#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 django-updates@googlegroups.com.
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to