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

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