У меня есть следующий код:не __init__ вызывается для двойного унаследованного класса
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
конструкторы.
UPDATE
Итак, я смотрел на все упомянутые классы __init__
«с, и они называют супер()!
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__
Более того, печать класса 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__
Но __init__
для FileFormMixin выполняется только в том случае, если я называю это явно как @ tom-karzes advised
Может быть, добавьте, почему замена заказа на изменение MRO без изменения - как указано, это может вызвать другие проблемы. Я понимаю, это потому, что модуль betterforms, не вызывающий супер-метод в смешанном инициализаторе класса, не должен быть переменным (третий сторонний код), правильно? – Dilettant
, пожалуйста, ознакомьтесь с обновленным вопросом – user37741
подкачки классов заказа решили проблему. благодаря! – user37741