Байланысты: Изучаем Python. Программирование игр, визуализация данных, веб-приложения ( PDFDrive )
Глава 19 • Учетные записи пользователей
Эта схема URL соответствует любому URL-адресу в форме
http:// localhost:8000/new_entry/id/ , где
id — число, равное идентификатору темы.
Выражение
(?P\d+)
захватывает числовое значение и сохраняет
его в переменной
topic_id
. При запросе URL-адреса, соответствующего этой
схеме, Django передает запрос и идентификатор темы функции представления
new_entry()
.
Функция представления new_entry()
Функция представления
new_entry
очень похожа на функцию добавления новой
темы:
views.py from django.shortcuts import render
...
from .models import Topic
from .forms import TopicForm, EntryForm
...
def new_entry(request, topic_id):
"""Добавляет новую запись по конкретной теме."""
topic = Topic.objects.get(id=topic_id)
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 HttpResponseRedirect(reverse('learning_logs:topic',
args=[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 из объекта запроса
. Затем проверяется корректность данных
формы. Если данные корректны, необходимо задать атрибут
topic
объекта записи
перед сохранением его в базе данных.
Редактирование данных
415 При вызове
save()
мы включаем аргумент
commit=False
для того, чтобы создать
новый объект записи и сохранить его в
new_entry
, не сохраняя пока в базе данных.
Мы присваиваем атрибуту
topic
объекта
new_entry
тему, прочитанную из базы дан-
ных в начале функции
, после чего вызываем
save()
без аргументов. В результате
запись сохраняется в базе данных с правильной ассоциированной темой.
В точке
пользователь перенаправляется на страницу темы. При вызове
reverse()
должны передаваться два аргумента: имя схемы URL, для которой
генерируется URL-адрес, и список аргументов со всеми аргументами, которые
должны быть включены в URL. Список аргументов содержит всего один элемент
topic_id
. Вызов
HttpResponseRedirect()
перенаправляет пользователя на стра-
ницу темы, для которой была создана запись, и пользователь видит новую запись
в списке записей.
Шаблон new_entry
Как видно из следующего кода, шаблон
new_entry
похож на шаблон
new_topic
:
new_entry.html {% extends "learning_logs/base.html" %}
{% block content %}
{{ topic }}
Add a new entry:
{% endblock content %}
В начале страницы выводится тема
, чтобы пользователь мог видеть, в какую тему
добавляется новая запись. Тема также служат ссылкой для возврата к основной
странице этой темы.
Аргумент
action
формы включает значение
topic_id
из URL, чтобы функция
представления могла связать новую запись с правильной темой
. В остальном
этот шаблон почти не отличается от
new_topic .html
.
Создание ссылки на страницу new_entry
Затем необходимо создать ссылку на страницу
new_entry
на каждой странице темы:
topic.html {% extends "learning_logs/base.html" %}
{% block content %}
Topic: {{ topic }}