__init__() получил неожиданный аргумент ключевого слова «запрос»

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