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

Метод 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,
    который упрощает создание объектов через формы
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить