Глава 19 • Учетные записи пользователей
❷
if request.method != 'POST':
# Данные не отправлялись; создается пустая форма.
❸
form = EntryForm()
else:
# Отправлены данные POST; обработать данные.
❹
form = EntryForm(data=request.POST)
if form.is_valid():
❺
new_entry = form.save(commit=False)
❻
new_entry.topic = topic
new_entry.save()
❼
return redirect('learning_logs:topic', topic_id=topic_id)
# Вывести пустую или недействительную форму.
context = {'topic': topic, 'form': form}
return render(request, 'learning_logs/new_entry.html', context)
Мы обновляем команду
import
и включаем в нее только что созданный класс
EntryForm
. Определение
new_entry()
содержит параметр
topic_id
для сохранения
полученного значения из URL. Идентификатор темы понадобится для отображе-
ния страницы и обработки данных формы, поэтому мы используем
topic_id
для
получения правильного объекта темы
.
В точке
проверяется метод запроса: POST или GET. Блок
if
выполняется для
запроса GET, и мы создаем пустой экземпляр
EntryForm
.
Для метода запроса POST мы обрабатываем данные, создавая экземпляр
EntryForm
,
заполненный данными POST из объекта
request
. Затем проверяется коррект-
ность данных формы. Если данные корректны, необходимо задать атрибут
topic
объекта записи перед сохранением его в базе данных. При вызове
save()
мы вклю-
чаем аргумент
commit=False
для того, чтобы создать новый объект записи и со-
хранить его в
new_entry
, не сохраняя пока в базе данных. Мы присваиваем атрибуту
topic
объекта
new_entry
тему, прочитанную из базы данных в начале функции
,
после чего вызываем
save()
без аргументов. В результате запись сохраняется в базе
данных с правильно ассоциированной темой.
Вызов
redirect()
в точке
получает два аргумента — имя представления, кото-
рому передается управление, и аргумент для функции представления. В данном
случае происходит перенаправление функции
topic()
, которой должен переда-
ваться аргумент
topic_id
. Вызов перенаправляет пользователя на страницу темы,
для которой была создана запись, и пользователь видит новую запись в списке
записей.
В конце функции создается словарь
context
, а страница строится на базе шаблона
new_entry .html
. Этот код выполняется для пустой формы или для отправленной
формы, которая была определена как недействительная.
Шаблон new_entry
Как видно из следующего кода, шаблон
new_entry
похож на шаблон
new_topic
: