#python #django
Вопрос:
Глупый вопрос: почему мы попадаем TypeError
только на super
«с __init__
«? Разве они не должны принимать одни и те же аргументы?
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
def __init__(self, *args, **kwargs):
# self.request = kwargs.pop('request')
super().__init__(*args, **kwargs)
Если это один и тот же метод одного и того же forms.ModelForm
класса, почему первый принимает request
, а второй нет?
Вот это ModelForm
__init__
:
def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
initial=None, error_class=ErrorList, label_suffix=None,
empty_permitted=False, instance=None, use_required_attribute=None,
renderer=None):
Итак, когда я звоню form = MyModelForm(request=request)
, почему MyModelForm
» с __init__
» пропускает его?
Ответ №1:
почему мы получаем ошибку типа только при инициализации супер? Разве они не должны принимать одни и те же аргументы?
Нет, это не так.
Когда вы создаете свой класс ModelForm, подпись его конструктора такова def __init__(self, *args, **kwargs)
, что нет никаких ключевых слов, просто **kwargs
это позволяет передавать любое количество аргументов ключевых слов при создании экземпляра MyModelForm
класса.
Вторая сигнатура функции поступает из ModelForm
класса django, который имеет ограниченное число аргументов ключевых слов, и только эти аргументы ключевых слов принимаются. Вы можете попробовать передать несколько случайных кваргов, например foo='bar'
, это снова выдаст ошибку.
def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
initial=None, error_class=ErrorList, label_suffix=None,
empty_permitted=False, instance=None, use_required_attribute=None,
renderer=None):
Но если бы он также имел **kwargs
в конце концов, то он также принимал бы любые аргументы ключевых слов.