Блог на Django #20: Обработка форм в представлениях

Необходимо создать новое представление, которое обрабатывает форму и отправляет 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'.

Дальше процесс отображения и обработки формы:

  1. Когда представление изначально загружается с запросом GET, создается новый экземпляр 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. Этот атрибут является словарем, где его значения — это поля формы.

Если форма не прошла проверку, в cleaned_data будут только те поля, данные которых подошли.

Теперь нужно узнать, как с помощью Django отправлять email.