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

Вернуться на верх