Не вызывает ли метод form_valid() в CBV метод is_valid()?

Когда я использовал функцию views, она смогла обработать очищенные_данные с помощью переопределения метода form.clean(). Я думал, что когда я вызываю метод form.is_valid, form.clean() тоже вызывается.

Валидация формы происходит после очистки данных. Если вы хотите настроить этот процесс, есть различные места для внесения изменений, каждое из которых служит для разных целей. Во время обработки формы выполняются три типа методов очистки. Обычно они выполняются, когда вы вызываете метод is_valid() на форме.

Теперь я пытаюсь сделать то же самое с помощью class-based-view, но это не работает, как я думал.

Вот мой forms.py:

class PublishForm(forms.ModelForm):
    class Meta:
        model = models.Article
        exclude = [
           'author',    
         ]

    def __init__(self, user, *args, **kwargs) -> None:
        self.user = user
        return super(PublishForm, self).__init__(*args, **kwargs)

    def is_valid(self):
        print('IS_VALID METHOD CALLED')
        return super(PublishForm, self).is_valid()

    def clean(self):
        print('CLEAN METHOD CALLED')
        cleaned = super(PublishForm, self).clean()
        cleaned['author'] = self.user
        return cleaned

и views.py:

class PublishView(generic.CreateView):
    form_class = forms.PublishForm
    success_url = '/'
    template_name = 'ex00/publish.html'

    def form_valid(self, form):
        print(form.cleaned_data)
        return super(PublishView, self).form_valid(form)

    def form_invalid(self, form):
        print(form.errors)
        return super(PublishView, self).form_invalid(form)

Похоже, что form_valid() не вызывает ни form.is_valid(), ни form.clean(). Но удалось получить form.clean_data().

Как работает form_valid()?
Что я должен сделать, чтобы манипулировать очищенными данными, как я это делал с form.is_valid()?

Краткий ответ: Он вызывает его в методе post. Вызов метода .clean() формы, является частью валидации с помощью form.is_valid().

Действительно, если мы посмотрим на исходный код ProcessFormView [GitHub], представление, которое наследуется CreateView, FormView и UpdateView, мы увидим:

class ProcessFormView(View):

    def post(self, request, *args, **kwargs):
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

Таким образом, метод post сначала создаст форму, затем проверит, действительна ли она, и в зависимости от этого вызовет метод form_valid или метод form_invalid.

Метод clean() вызывается не представлением, но является частью метода form.is_valid(), чтобы очистить все отдельные поля, а затем вызвать clean() для проверки элементов, не относящихся к определенному полю.

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