Необходимо создать новое представление, которое обрабатывает форму и отправляет email при успешном принятии. Отредактируйте файл views.py
приложения blog
и добавьте следующий код:
from .forms import EmailPostForm
def post_share(request, post_id):
# Получить пост по id
post = get_object_or_404(Post, id=post_id, 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 поста. Также ярлык проверяет что статус поста —published
. - Одно и то же представление используется для отображения изначальной формы и обработки отправленных данных. На основе метода
request
можно понять, были ли данные отправлены с помощью формы или еще нет, а принятие происходит с помощьюPOST
. Предполагаем, что если запросGET
, то форма будет отображаться пустой, а еслиPOST
— форма отправляется и обрабатывается. Таким образом для поиска отличий в сценариях используетсяrequest.method == 'POST'
.
Дальше процесс отображения и обработки формы:
- Когда представление изначально загружается с запросом
GET
, создается новый экземплярform
, который будет использоваться для отображения пустой формы в шаблоне:form = EmailPostForm()
- Пользователь заполняет форму и отправляет ее с помощью
POST
. Затем создается экземпляр формы с помощью отправленных данных, которые хранятся вrequest.POST
:if request.method == 'POST': # Форма была отправлена form = EmailPostForm(request.POST)
- После этого отправленные данные проверяются с помощью метода формы
is_valid()
. Он проверяет данные и возвращаетTrue
, если все поля содержат прошедшие проверку данные. Если где-то указана неправильная информация, методis_valid()
возвращаетFalse
. Список ошибок проверки можно посмотреть, получив доступ кform.errors
. - Если форма не прошла проверку, то она снова рендерится в шаблоне с новыми данными. Ошибки проверки отображаются в шаблоне.
- Если проверка пройдена, доступ к данным можно получить с помощью
form.cleaned_data
. Этот атрибут является словарем, где его значения — это поля формы.
Если форма не прошла проверку, в
cleaned_data
будут только те поля, данные которых подошли.
Теперь нужно узнать, как с помощью Django отправлять email.