__init__() получила неожиданный аргумент ключевого слова 'request'
Глупый вопрос: почему мы получаем TypeError
только на super
's __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__
?
почему мы получаем TypeError только на супер-функции init? Разве они не не должны принимать одинаковые аргументы?
Нет, не являются.
Когда вы создаете класс ModelForm, сигнатура его конструктора имеет вид def __init__(self, *args, **kwargs)
, поэтому в ней нет никаких ключевых слов, только **kwargs
, что позволяет передавать любое количество аргументов ключевых слов при создании экземпляра класса MyModelForm
.
Вторая сигнатура функции происходит из класса django ModelForm
, который имеет ограниченное количество аргументов ключевых слов, и только эти аргументы ключевых слов принимаются. Вы можете попробовать передать произвольные kwargs, например 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
, то он также принимал бы любые аргументы ключевых слов.