Метод 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 для перенаправления после успешной отправки формы