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

139

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

Тест на знание python

Если выполнить код ниже, каков будет результат?
Какой будет результат выполнения этого кода?
Что выведет этот код?
Что выведет этот код?
Какой цикл `for` выведет такой результат?
Викиум