__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, то он также принимал бы любые аргументы ключевых слов.