Глава 19 • Учетные записи пользователей
Функция представления new_topic()
Функция
new_topic()
должна обрабатывать две разные ситуации: исходные за-
просы страницы
new_topic
(в этом случае должна отображаться пустая форма)
и обработка данных, отправленных через форму. Затем она должна перенаправить
пользователя обратно на страницу
topics
:
views.py
from django.shortcuts import render
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from .models import Topic
from .forms import TopicForm
...
def new_topic(request):
"""Определяет новую тему."""
if request.method != 'POST':
# Данные не отправлялись; создается пустая форма.
form = TopicForm()
else:
# Отправлены данные POST; обработать данные.
form = TopicForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('learning_logs:topics'))
context = {'form': form}
return render(request, 'learning_logs/new_topic.html', context)
Мы импортируем класс
HttpResponseRedirect
, который будет использоваться
для перенаправления пользователя к странице
topics
после отправки введенной
темы. Функция
reverse()
определяет URL по заданной схеме URL (то есть Django
сгенерирует URL при запросе страницы). Также импортируется только что напи-
санная форма
TopicForm
.
Запросы GET и POST
При построении веб-приложений используются два основных типа запросов —
GET и POST. Запросы GET используются для страниц, которые только читают
данные с сервера, а запросы POST обычно используются в тех случаях, когда
пользователь должен отправить информацию через форму. Для обработки всех
наших форм будет использоваться метод POST (существуют и другие разновид-
ности запросов, но в нашем проекте они не используются).
Функция
new_topic()
получает в параметре объект запроса. Когда пользователь
впервые запрашивает эту страницу, его браузер отправляет запрос GET. Когда
пользователь уже заполнил и отправил форму, его браузер отправляет запрос
POST. В зависимости от типа запроса мы определяем, запросил ли пользователь
Редактирование данных
411
пустую форму (запрос GET) или предлагает обработать заполненную форму (за-
прос POST).
Метод запроса — GET или POST — проверяется в точке
. Если метод запро-
са отличен от POST, вероятно, используется запрос GET, поэтому необходимо
вернуть пустую форму (даже если это запрос другого типа, это все равно безопас-
но). Мы создаем экземпляр
TopicForm
, сохраняем его в переменной
form
и от-
правляем форму шаблону в словаре
context
. Так как при создании
TopicForm
аргументы не передавались, Django создает пустую форму, которая заполняется
пользователем.
Если используется метод запроса POST, выполняется блок
else
, кото-
рый обрабатывает данные, отправленные в форме. Мы создаем экземпляр
TopicForm
и передаем ему данные, введенные пользователем, хранящиеся
в
request.POST
. Возвращаемый объект
form
содержит информацию, отправлен-
ную пользователем.
Отправленную информацию нельзя сохранять в базе данных до тех пор, пока она
не будет проверена
. Функция
is_valid()
проверяет, что все обязательные поля
были заполнены (все поля формы по умолчанию являются обязательными), а вве-
денные данные соответствуют типам полей — например, что длина текста меньше
200 символов, как было указано в файле
models .py
в главе 18. Автоматическая про-
верка избавляет нас от большого объема работы. Если все данные действительны,
можно вызвать метод
save()
, который записывает данные из формы в базу дан-
ных. После того как данные будут сохранены, страницу можно покинуть. Мы ис-
пользуем вызов
reverse()
для получения URL-адреса страницы
topics
и передаем
его функции
HttpResponseRedirect()
, перенаправляющей браузер пользователя
на страницу
topics
. На этой странице пользователь видит только что введенную
им тему в общем списке тем.
Шаблон new_topic
Теперь создадим новый шаблон с именем
new_topic .html
для отображения только
что созданной формы:
new_topic.html
{% extends "learning_logs/base.html" %}
{% block content %}
Add a new topic:
{% endblock content %}
Этот шаблон расширяет
base .html
, поэтому он имеет такую же базовую структуру,
как и остальные страницы Learning Log. В точке
определяется форма HTML.
Аргумент
action
сообщает серверу, куда передавать данные, отправленные фор-
412
Достарыңызбен бөлісу: |