Метод form_valid
Метод form_valid класса FormView вызывается автоматически, когда переданная форма проходит валидацию. Он получает экземпляр валидной формы и выполняет основную логику обработки данных - например, сохранение модели, отправку письма или запись в сессию. Метод должен возвращать объект ответа, обычно редирект на страницу успеха. Если в наследнике не переопределить этот метод, по умолчанию он выполнит редирект на атрибут FormView/attribute/success_url/">success_url.
Метод принимает один параметр - form, который содержит очищенные и валидированные данные. Вы можете обратиться к данным через словарь form.cleaned_data. Переопределяя метод, вы можете добавлять дополнительную обработку, например, привязывать созданный объект к текущему пользователю.
Синтаксис
class MyFormView(FormView):
form_class = MyForm
template_name = 'my_template.html'
success_url = '/success/'
def form_valid(self, form):
# Обработка данных формы
return super().form_valid(form)
Пример
Базовое использование метода form_valid для сохранения данных формы в модель и редиректа на страницу успеха:
from django.views.generic import FormView
from django.shortcuts import redirect
from .forms import ContactForm
from .models import Contact
class ContactFormView(FormView):
template_name = 'contact.html'
form_class = ContactForm
success_url = '/contact/thanks/'
def form_valid(self, form):
# Создание объекта и сохранение в БД
contact = Contact(
name=form.cleaned_data['name'],
email=form.cleaned_data['email'],
message=form.cleaned_data['message']
)
contact.save()
return super().form_valid(form)
Результат выполнения кода:
"Redirects to /contact/thanks/ and saves contact to database"
Пример
Переопределение метода для добавления дополнительной логики - например, отправка email-уведомления после успешной отправки формы:
from django.views.generic import FormView
from django.core.mail import send_mail
from .forms import SubscribeForm
class SubscribeFormView(FormView):
template_name = 'subscribe.html'
form_class = SubscribeForm
success_url = '/subscribe/thanks/'
def form_valid(self, form):
email = form.cleaned_data['email']
# Отправка письма администратору
send_mail(
'New subscriber',
f'Email: {email}',
'from@example.com',
['admin@example.com'],
fail_silently=False,
)
return super().form_valid(form)
Результат выполнения кода:
"Email sent to admin@example.com and redirects to success page"
Пример
Пример обработки формы с привязкой созданного объекта к текущему авторизованному пользователю:
from django.views.generic import FormView
from .forms import ProfileForm
from .models import UserProfile
class ProfileUpdateView(FormView):
template_name = 'profile_update.html'
form_class = ProfileForm
success_url = '/profile/'
def form_valid(self, form):
# Получаем текущего пользователя
user = self.request.user
# Обновляем профиль пользователя
profile, created = UserProfile.objects.get_or_create(user=user)
profile.bio = form.cleaned_data['bio']
profile.birth_date = form.cleaned_data['birth_date']
profile.save()
return super().form_valid(form)
Результат выполнения кода:
"Profile updated for user and redirects to /profile/"
Смотрите также
-
метод
form_invalid,
который вызывается при ошибках валидации формы -
метод
get_form,
который создает экземпляр формы для представления -
метод
get_success_url,
который определяет URL для редиректа после успеха -
класс
CreateView,
который упрощает создание объектов через формы