Работа с формами в представлениях
Мы определили форму для рекомендации постов по электронной почте. Теперь требуется представление, чтобы создавать экземпляр формы и работать с передачей формы на обработку.
Отредактируйте файл views.py приложения blog, добавив следующий ниже исходный код:
from .forms import EmailPostForm
def post_share(request, post_id):
# Извлечь пост по идентификатору id
post = get_object_or_404(Post,
id=post_id,
status=Post.Status.PUBLISHED)
if request.method == 'POST':
# Форма была передана на обработку
form = EmailPostForm(request.POST)
if form.is_valid():
# Поля формы успешно прошли валидацию
cd = form.cleaned_data
# ... отправить электронное письмо
else:
form = EmailPostForm()
return render(request, 'blog/post/share.html', {'post': post,
'form': form})
Мы определили представление post_share, которое в качестве параметров принимает объект request и переменную post_id.
Мы используем функцию сокращенного доступа get_object_or_404(), чтобы извлечь опубликованный пост по его id.
Одно и то же представление используется как для отображения изначальной формы на странице, так и для обработки представленных для валидации данных.
HTTP-метод request позволяет различать случаи, когда форма передается на обработку.
Запрос GET будет указывать на то, что пользователю должна быть отображена пустая форма, а запрос POST – на то, что форма передается на обработку.
Булево выражение request.method == 'POST' используется для того, чтобы проводить различие между этими двумя сценариями.
Ниже описывается процесс отображения формы на странице и работы с передачей формы на обработку:
1. Когда страница загружается в первый раз, представление получает запрос GET. В этом случае создается новый экземпляр класса EmailPostForm, который сохраняется в переменной form. Указанный экземпляр формы будет использоваться для отображения пустой формы в шаблоне:
form = EmailPostForm()
2. Когда пользователь заполняет форму и передает ее методом POST на обработку, создается экземпляр формы с использованием переданных данных, содержащихся в request.POST:
if request.method == 'POST':
# Форма была передана на обработку
form = EmailPostForm(request.POST)
3. После этого переданные данные валидируются методом is_valid() формы. Указанный метод проверяет допустимость введенных в форму данных и возвращает значение True, если все поля содержат валидные данные. Если какое-либо поле содержит не валидные данные, то is_valid() возвращает значение False. Список ошибок валидации можно получить посредством form.errors.
4. Если форма не валидна, то форма снова прорисовывается в шаблоне, включая переданные данные. Ошибки валидации будут отображены в шаблоне.
5. Если форма валидна, то валидированные данные извлекаются посредством form.cleaned_data. Указанный атрибут представляет собой словарь полей формы и их значений.