Класс FormView

Класс FormView - это встроенное представление на основе классов, которое предназначено для работы с формами. Он автоматически отображает форму при GET-запросе, обрабатывает POST-запрос и выполняет валидацию данных. При успешной валидации вызывается метод form_valid, который обычно выполняет редирект или сохраняет данные. При неудачной валидации форма повторно отображается с ошибками. Основные атрибуты класса - form_class (класс формы) и success_url (URL для редиректа после успешной обработки). Ключевые методы - get_form (возвращает экземпляр формы), form_valid (обработка валидной формы) и form_invalid (обработка невалидной формы).

Синтаксис

pythonfrom django.views.generic.edit import FormView
from .forms import MyForm

class MyFormView(FormView):
  form_class = MyForm
  template_name = 'myapp/form.html'
  success_url = '/success/'

  def form_valid(self, form):
    # Обработка валидных данных
    return super().form_valid(form)

Пример

Создадим форму для регистрации пользователя с полями 'username' и 'email':

pythonfrom django import forms

class RegistrationForm(forms.Form):
  username = forms.CharField(max_length=100)
  email = forms.EmailField()

from django.views.generic.edit import FormView
from django.http import HttpResponse

class RegistrationView(FormView):
  form_class = RegistrationForm
  template_name = 'registration.html'
  success_url = '/thank-you/'

  def form_valid(self, form):
    username = form.cleaned_data['username']
    email = form.cleaned_data['email']
    # Здесь можно сохранить данные в базу
    res = f"User {username} with email {email} registered"
    print(res)
    return super().form_valid(form)

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

python"User john with email john@example.com registered"

Пример

Используем FormView с моделью для создания новой записи в базе данных:

pythonfrom django.db import models

class Article(models.Model):
  title = models.CharField(max_length=200)
  content = models.TextField()
  created_at = models.DateTimeField(auto_now_add=True)

from django import forms

class ArticleForm(forms.ModelForm):
  class Meta:
    model = Article
    fields = ['title', 'content']

from django.views.generic.edit import FormView
from django.shortcuts import redirect

class ArticleCreateView(FormView):
  form_class = ArticleForm
  template_name = 'article_create.html'
  success_url = '/article-list/'

  def form_valid(self, form):
    article = form.save()
    print(f"Article '{article.title}' created")
    return redirect(self.success_url)

  def form_invalid(self, form):
    print("Form validation failed")
    return super().form_invalid(form)

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

python"Article 'Django FormView Guide' created"

Пример

Переопределим метод get_form для динамического изменения формы в зависимости от пользователя:

pythonfrom django.views.generic.edit import FormView
from .forms import ProfileForm

class ProfileView(FormView):
  form_class = ProfileForm
  template_name = 'profile.html'
  success_url = '/profile/'

  def get_form(self, form_class=None):
    form = super().get_form(form_class)
    if self.request.user.is_authenticated:
      form.fields['email'].initial = self.request.user.email
      form.fields['username'].initial = self.request.user.username
    return form

  def form_valid(self, form):
    # Сохраняем изменения профиля
    user = self.request.user
    user.username = form.cleaned_data['username']
    user.email = form.cleaned_data['email']
    user.save()
    print(f"Profile updated for {user.username}")
    return super().form_valid(form)

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

python"Profile updated for johndoe"

Пример

Переопределим метод get_success_url для динамического определения URL после успешной обработки:

pythonfrom django.views.generic.edit import FormView
from django.urls import reverse
from .forms import SearchForm

class SearchView(FormView):
  form_class = SearchForm
  template_name = 'search.html'

  def get_success_url(self):
    query = self.request.POST.get('query', '')
    return reverse('results') + f'?q={query}'

  def form_valid(self, form):
    query = form.cleaned_data['query']
    print(f"Searching for: {query}")
    return super().form_valid(form)

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

python"Searching for: django tutorial"

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

  • класс form_class,
    который определяет класс формы для обработки
  • класс success_url,
    который задаёт URL для редиректа после успешной обработки
  • метод get_form,
    который возвращает экземпляр формы для представления
  • метод form_valid,
    который обрабатывает валидную форму и сохраняет данные