РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
315 of 818 menu

Метод form_invalid

Метод form_invalid применяется в классе FormView и вызывается автоматически, когда отправленная форма не проходит валидацию. Этот метод получает экземпляр формы с ошибками и возвращает HTTP-ответ, обычно с повторным отображением той же страницы с выводом сообщений об ошибках. По умолчанию метод рендерит шаблон с формой, содержащей ошибки валидации.

Синтаксис

class MyFormView(FormView): def form_invalid(self, form): # Обработка невалидной формы return super().form_invalid(form)

Пример

Базовое использование метода form_invalid без переопределения:

from django.views.generic import FormView from django import forms class ContactForm(forms.Form): name = forms.CharField(max_length=100) email = forms.EmailField() class ContactView(FormView): template_name = 'contact.html' form_class = ContactForm success_url = '/thanks/' def form_valid(self, form): # Обработка валидной формы return super().form_valid(form) def form_invalid(self, form): # Обработка невалидной формы return super().form_invalid(form)

Результат выполнения кода:

"Возвращается страница с формой, содержащей ошибки валидации"

Пример

Переопределение метода для добавления пользовательской логики при ошибке валидации:

from django.views.generic import FormView from django import forms from django.contrib import messages class RegistrationForm(forms.Form): username = forms.CharField(max_length=50) password = forms.CharField(widget=forms.PasswordInput) confirm_password = forms.CharField(widget=forms.PasswordInput) def clean(self): cleaned_data = super().clean() password = cleaned_data.get('password') confirm = cleaned_data.get('confirm_password') if password and confirm and password != confirm: raise forms.ValidationError('Пароли не совпадают') return cleaned_data class RegisterView(FormView): template_name = 'register.html' form_class = RegistrationForm success_url = '/profile/' def form_invalid(self, form): # Добавляем сообщение об ошибке messages.error(self.request, 'Пожалуйста, исправьте ошибки в форме') # Логируем ошибку print('Ошибка валидации формы регистрации') return super().form_invalid(form)

Результат выполнения кода:

"Пользователь видит сообщение об ошибке и форму с подсветкой полей"

Пример

Изменение шаблона или контекста при невалидной форме:

from django.views.generic import FormView from django import forms from django.shortcuts import render class LoginForm(forms.Form): username = forms.CharField() password = forms.CharField(widget=forms.PasswordInput) class LoginView(FormView): template_name = 'login.html' form_class = LoginForm success_url = '/dashboard/' def form_invalid(self, form): # Добавляем дополнительную информацию в контекст context = self.get_context_data(form=form) context['error_type'] = 'invalid_credentials' context['attempts'] = self.request.session.get('login_attempts', 0) + 1 self.request.session['login_attempts'] = context['attempts'] # Используем другой шаблон при ошибке return render(self.request, 'login_error.html', context)

Результат выполнения кода:

"Отображается кастомный шаблон с информацией о количестве попыток входа"

Смотрите также

  • метод form_valid,
    который вызывается при успешной валидации формы
  • метод get_form,
    который возвращает экземпляр формы
  • атрибут form_class,
    который определяет класс формы для представления
  • атрибут success_url,
    который задает URL для перенаправления после успешной отправки формы
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить