Визуализация форм в шаблонах
Создайте новый файл в blog/templates/blog/post/ и назовите его share.html. Добавьте в него следующий код:
{% extends "blog/base.html" %}
{% block title %}Share a post{% endblock %}
{% block content %}
{% if sent %}
<h1>E-mail successfully sent</h1>
<p>
"{{ post.title }}" was successfully sent to {{ cd.to }}.
</p>
{% else %}
<h1>Share "{{ post.title }}" by e-mail</h1>
<form action="." method="post">
{{ form.as_p }}
{% csrf_token %}
<input type="submit" value="Send e-mail">
</form>
{% endif %}
{% endblock %}
Это шаблон для отображения формы и сообщения об успешной отправке письма. Как видите, мы создаем элемент HTML <form>
, указывающий на то, что он должен быть отправлен методом POST:
<form action="." method="post">
Затем мы говорим Джанго, отобразить поля в HTML теге <p>
методом as_p. Можно также визуализировать форму в виде неупорядоченного списка as_ul или в виде таблицы as_table. Если требуется визуализировать каждое поле, можно также выполнить итерацию по полям, как показано в следующем примере:
{% for field in form %}
<div>
{{ field.errors }}
{{ field.label_tag }} {{ field }}
</div>
{% endfor %}
Тег шаблона {% csrf_token %}
вводит скрытое поле с автоматически сгенерированным токеном, чтобы избежать атак Cross-Site request forgery (CSRF). Эти атаки состоят из вредоносного пути или программы, выполняющей нежелательные действия для пользователя на вашем сайте. Дополнительные сведения об этом можно найти в: https://en.wikipedia.org/wiki/Cross-site\_request\_forgery
Предыдущий тег создает скрытое поле, которое выглядит следующим образом:
<input type='hidden' name='csrfmiddlewaretoken' value='26JjKo2lcEtYkGoV9z4XmJIEHLXN5LDR' />
По умолчанию Джанго проверяет CSRF token во всех POST запросах.
Не забывайте включать тег csrf_token во все формы, отправляемые через POST.
Отредактируйте файл blog/post/detail.html и добавьте следующие строки после переменной {{ post.body|linebreaks }}
:
<p>
<a href="{% url "blog:post_share" post.id %}">Share this post</a>
</p>
Помните, что при динамическом создании URL-адреса используется тег шаблона {% url %}
. Мы используем пространство имен, называемое 'blog', и URL-адрес с именем post_share, и передаем post ID как параметр для построения абсолютного URL-адреса.
Теперь перейдите по адресу http://127.0.0.1:8000/blog/ Пройдите в любой из постов. В теле записи вы должны увидеть ссылку, которую мы только что добавили, как показано на следующем рисунке:
Кликните на ссылку Share this post и вы увидите страницу, с формой для отправки поста по электронной почте. Она должен выглядеть следующим образом:
Стили CSS для формы включаются в пример кода в static/css/blog.css. По клику на кнопку "Send e-mail" форма проверяется и отправляется. Если все поля содержат допустимые данные, будет получено сообщение об успешной отправке:
При вводе недопустимых данных будет отображена повторная визуализация формы, включая все ошибки проверки: