Метод get_form
Метод get_form применяется к классу представления FormView и возвращает экземпляр формы, указанной в атрибуте FormView/attribute/form_class/">form_class. Этот метод вызывается автоматически перед обработкой запроса, чтобы подготовить форму для отображения или валидации. Он учитывает метод запроса: для GET возвращается пустая или предзаполненная форма, а для POST - форма с переданными данными. Метод полезен для кастомизации инициализации формы, например, для передачи начальных значений или изменения полей в зависимости от контекста.
Синтаксис
from django.views.generic.edit import FormView
class MyFormView(FormView):
form_class = MyForm
template_name = 'my_template.html'
success_url = '/success/'
def get_form(self, form_class=None):
# кастомизация формы
return form_class(**self.get_form_kwargs())
Пример
Создадим простую форму для поиска статей по названию и используем get_form для передачи начального значения:
from django import forms
from django.views.generic.edit import FormView
from django.shortcuts import render
from myapp.models import Article
class SearchForm(forms.Form):
query = forms.CharField(max_length=100, required=False)
class SearchView(FormView):
template_name = 'search.html'
form_class = SearchForm
success_url = '/results/'
def get_form(self, form_class=None):
if form_class is None:
form_class = self.get_form_class()
# Передаём начальное значение 'Django' в поле query
initial = self.get_initial()
initial['query'] = 'Django'
self.initial = initial
return form_class(**self.get_form_kwargs())
def form_valid(self, form):
query = form.cleaned_data['query']
articles = Article.objects.filter(title__icontains=query)
# Здесь можно сохранить результаты в сессии или передать через контекст
return super().form_valid(form)
Результат: при загрузке страницы поле поиска будет предзаполнено словом "Django".
Пример
Используем get_form для динамического изменения поля формы в зависимости от роли пользователя:
from django import forms
from django.views.generic.edit import FormView
from myapp.models import Article
class ArticleForm(forms.Form):
title = forms.CharField(max_length=100)
content = forms.CharField(widget=forms.Textarea)
class ArticleCreateView(FormView):
template_name = 'article_create.html'
form_class = ArticleForm
success_url = '/articles/'
def get_form(self, form_class=None):
if form_class is None:
form_class = self.get_form_class()
form = form_class(**self.get_form_kwargs())
# Если пользователь не является администратором, делаем поле content обязательным
if not self.request.user.is_staff:
form.fields['content'].required = True
return form
def form_valid(self, form):
# Создание статьи
Article.objects.create(
title=form.cleaned_data['title'],
content=form.cleaned_data['content']
)
return super().form_valid(form)
Результат: для обычных пользователей поле "content" становится обязательным, а для администраторов - нет.
Пример
Переопределим get_form для передачи дополнительных аргументов в форму, например, текущего пользователя:
from django import forms
from django.views.generic.edit import FormView
from myapp.models import Article
class UserForm(forms.Form):
title = forms.CharField(max_length=100)
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user', None)
super().__init__(*args, **kwargs)
class UserArticleView(FormView):
template_name = 'user_article.html'
form_class = UserForm
success_url = '/user-articles/'
def get_form(self, form_class=None):
if form_class is None:
form_class = self.get_form_class()
kwargs = self.get_form_kwargs()
kwargs['user'] = self.request.user
return form_class(**kwargs)
def form_valid(self, form):
# Используем пользователя из формы
user = form.user
Article.objects.create(
title=form.cleaned_data['title'],
author=user
)
return super().form_valid(form)
Результат: форма получает объект пользователя и использует его при создании статьи.
Смотрите также
-
атрибут
form_class,
который определяет класс формы, используемый представлением -
метод
get_success_url,
который возвращает URL для перенаправления после успешной отправки формы -
метод
form_valid,
который вызывается при успешной валидации формы -
метод
form_invalid,
который обрабатывает невалидную форму