Класс FormView
Класс FormView - это встроенное представление на основе классов,
которое предназначено для работы с формами. Он автоматически отображает
форму при GET-запросе, обрабатывает POST-запрос и выполняет валидацию
данных. При успешной валидации вызывается метод form_valid,
который обычно выполняет редирект или сохраняет данные. При неудачной
валидации форма повторно отображается с ошибками. Основные атрибуты
класса - form_class (класс формы) и success_url (URL
для редиректа после успешной обработки). Ключевые методы -
get_form (возвращает экземпляр формы), form_valid
(обработка валидной формы) и form_invalid (обработка
невалидной формы).
Синтаксис
from 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':
from 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)
Результат выполнения кода при отправке валидной формы:
"User john with email john@example.com registered"
Пример
Используем FormView с моделью для создания новой записи
в базе данных:
from 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)
Результат выполнения кода при создании статьи:
"Article 'Django FormView Guide' created"
Пример
Переопределим метод get_form для динамического изменения
формы в зависимости от пользователя:
from 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)
Результат выполнения кода при обновлении профиля:
"Profile updated for johndoe"
Пример
Переопределим метод get_success_url для динамического
определения URL после успешной обработки:
from 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)
Результат выполнения кода при поиске:
"Searching for: django tutorial"
Смотрите также
-
класс
form_class,
который определяет класс формы для обработки -
класс
success_url,
который задаёт URL для редиректа после успешной обработки -
метод
get_form,
который возвращает экземпляр формы для представления -
метод
form_valid,
который обрабатывает валидную форму и сохраняет данные