Рекомендация постов по электронной почте
Теперь мы научимся создавать формы и отправлять электронные письма с помощью Django.
Мы предоставим пользователям возможность делиться постами блога с другими, отправляя рекомендуемые посты по электронной почте.
Найдите минутку, чтобы подумать о том, как можно бы использовать представления, URL-адреса и шаблоны для создания этой функциональности, используя то, что вы узнали в разделе 4.1 "Работа с формами".
Для того чтобы дать пользователям возможность делиться постами по электронной почте, необходимо:
-
создать форму, в которой пользователи должны заполнить свое имя,
-
адрес электронной почты, адрес электронной почты получателя и опциональные комментарии;
-
создать представление в файле
views.py, которое обрабатывает опубликованные данные и отправляет электронное письмо; -
добавить шаблон URL-адреса нового представления в файл
urls.pyприложенияblog; -
создать шаблон отображения формы.
Разработка форм с помощью Django
Давайте начнем с разработки формы, позволяющей делиться постами. Django имеет встроенный фреймворк форм, который позволяет легко создавать формы. Фреймворк форм упрощает определение полей формы, указывает их внешний вид на странице и способы валидации ими входных данных.
Встроенный в Django фреймворк форм предлагает гибкий способ прорисовки форм в исходном коде HTML и оперирования данными. Мы уже изучили теорию, давайте перейдем к практике.
Django поставляется с двумя базовыми классами для разработки форм:
-
Form: позволяет компоновать стандартные формы путем определения полей и валидаций; -
ModelForm: позволяет компоновать формы, привязанные к экземплярам модели. Он предоставляет все функциональности базового классаForm, но поля формы можно объявлять явным образом или автоматически генерировать из полей модели. Форму можно использовать для создания либо редактирования экземпляров модели.
Сначала внутри каталога приложения blog создайте файл forms.py и добавьте в него следующий ниже исходный код:
from django import forms
class EmailPostForm(forms.Form):
name = forms.CharField(max_length=25)
email = forms.EmailField()
to = forms.EmailField()
comments = forms.CharField(required=False,
widget=forms.Textarea)
Мы определили первую форму Django. Форма EmailPostForm наследует от базового класса Form. Мы используем различные типы полей, чтобы выполнять валидацию данных в соответствии с ними.
Форма содержит следующие ниже поля:
-
name: экземпляр классаCharFieldс максимальной длиной 25 символов, который будет использоваться для имени человека, отправляющего пост; -
email: экземпляр классаEmailField. Здесь используется адрес электронной почты человека, отправившего рекомендуемый пост; -
to: экземпляр классаEmailField. Здесь используется адрес электронной почты получателя, который будет получать электронное письмо с рекомендуемым постом; -
comments: экземпляр классаCharField. Он используется для комментариев, которые будут вставляться в электронное письмо с рекомендуемым постом. Это поле сделано опциональным путем установкиrequiredравным значениюFalse, при этом был задан конкретно-прикладной виджет прорисовки поля.
У каждого типа поля есть заранее заданный виджет, который определяет то, как поле прорисовывается в исходном коде HTML.
Поле name является экземпляром класса CharField. Поле этого типа прорисовывается как HTML-элемент <input type="text">.
Заранее заданный виджет можно переопределять посредством атрибута widget.
В поле comments используется виджет Textarea, чтобы отображать его как HTML-элемент <textarea> вместо используемого по умолчанию элемента <input>.
Валидация полей также зависит от типа полей. Например, поля email и to являются полями типа EmailField.
Для обоих полей требуется валидный адрес электронной почты; в противном случае валидация поля вызовет исключение forms.ValidationError, и форма не пройдет валидацию.
При валидации полей формы также принимаются во внимание и другие параметры, такие как поле name, имеющее максимальную длину 25, или поле comments, являющееся опциональным.
Это лишь некоторые типы полей, которые Django предоставляет для форм.
Список всех имеющихся типов полей мы рассмотрели с вами в разделе 4.1 "Работа с формами".