I have the following code:
from form_utils import forms as betterforms
from django.db import models
class FilterForm(betterforms.BetterForm):
def __init__(self, *args, **kwargs):
super(FilterForm, self).__init__(*args, **kwargs)
print('filter form __init__')
...
class NewEntityForm(FilterForm, FileFormMixin):
def __init__(self, *args, **kwargs):
super(NewEntityForm, self).__init__(*args, **kwargs)
# super(FileFormMixin, self).__init__() <-- really does not matter
print('newentityform __init__')
FileForMixin的定义如下:
class FileFormMixin(object):
def __init__(self, *args, **kwargs):
super(FileFormMixin, self).__init__(*args, **kwargs)
print('file form mixin __init__')
FileFormMixin
由https://github.com/mbraak/django-file-form提供,而betterforms由https://github.com/carljm/django-form-utils提供。
问题是,FileFormMixin
的__init__
从未被调用。我该如何解决?我确实需要全部它们。目前它仅执行FilterForm
和NewEntityForm
构造函数。
更新
所以,我查看了所有提到的类的__init__
,它们都在调用super()!
FileFormMixin
:
class FileFormMixin(object):
def __init__(self, *args, **kwargs):
super(FileFormMixin, self).__init__(*args, **kwargs)
BetterForm
:
class BetterBaseForm(object):
...
def __init__(self, *args, **kwargs):
self._fieldsets = deepcopy(self.base_fieldsets)
self._row_attrs = deepcopy(self.base_row_attrs)
self._fieldset_collection = None
super(BetterBaseForm, self).__init__(*args, **kwargs)
class BetterForm(with_metaclass(BetterFormMetaclass, BetterBaseForm),
forms.Form):
__doc__ = BetterBaseForm.__doc__
更进一步,按照@elwin-arens的建议,将打印类的mro,得到以下输出:
filter form __init__
NewEntityForm.__mro__ (<class 'myapp.forms.NewEntityForm'>, <class 'myapp.forms.FilterForm'>, <class 'form_utils.forms.BetterForm'>, <class 'django.forms.widgets.NewBase'>, <class 'form_utils.forms.BetterBaseForm'>, <class 'django.forms.forms.Form'>, <class 'django.forms.forms.BaseForm'>, <class 'django_file_form.forms.FileFormMixin'>, <class 'object'>)
newsiteform __init__
但是,只有在我明确调用它时,才会执行FileFormMixin的__init__
,正如@tom-karzes所建议的那样。
BaseForm
没有调用它的超类。在您添加的 MRO 的BaseForm
中,BaseForm
的超类应该触发FileFormMixin
的__init__
。但是,如果任何一个位于FileFormMixin
之前的类没有调用super init
,那么链就会断掉。https://github.com/django/django/blob/ec6121693f112ae33b653b4364e812722d2eb567/django/forms/forms.py#L72-98 - Elwin Arens