Сначала необходимо импортировать модель Entry. В точке (1) мы получаем объект записи, который пользователь хочет изменить, и тему, связанную с этой записью. В блоке if, который выполняется для запроса GET, создается экземпляр EntryForm с аргументом instance=entry (2). Этот аргумент приказывает Django создать форму, заранее заполненную информацией из существующего объекта записи. Пользователь видит свои существующие данные и может отредактировать их.
При обработке запроса POST передаются аргументы instance=entry и data=request.POST (3), чтобы приказать Django создать экземпляр формы на основании информации существующего объекта записи, обновленный данными из request.POST. Затем проверяется корректность данных формы. Если данные корректны, следует вызов save() без аргументов (4). Далее происходит перенаправление на страницу темы (5), и пользователь видит обновленную версию отредактированной им записи.
Шаблон edit_entry
Шаблон edit_entry.html очень похож на new_entry.html:
edit_entry.html
{% extends "learning_logs/base.html" %}
{% block content %}
. .
Edit entry:
. .
(1)
. .{% csrf_token %}
. .{{ form.as_p }}
(2) . .
{% endblock content %}
В точке (1) аргумент action отправляет форму функции edit_entry() для обработки. Идентификатор записи включается как аргумент в тег {% url %} , чтобы функция представления могла изменить правильный объект записи. Кнопка отправки данных создается с текстом, который напоминает пользователю, что он сохраняет изменения, а не создает новую запись (2).
Создание ссылки на страницу edit_entry
Теперь необходимо включить ссылку на страницу edit_entry в каждую тему на странице со списком тем:
topic.html
...
{% for entry in entries %}
{{ entry.date_added|date:'M d, Y H:i' }}
{{ entry.text|linebreaks }}
. .
. . . .edit entry
. .
...
После даты и текста каждой записи включается ссылка редактирования. Мы используем шаблонный тег {% url %} для определения схемы URL из именованной схемы edit_entry и идентификатора текущей записи в цикле (entry.id). Текст ссылки "edit entry" выводится после каждой записи на странице. На рис. 19.3 показано, как выглядит страница со списком тем с этими ссылками.
Приложение Learning Log уже сейчас содержит бульшую часть необходимой функциональности. Пользователи могут добавлять темы и записи, а также читать любые записи по своему усмотрению. В этом разделе мы реализуем систему
Рис. 19.3. Каждая запись снабжается ссылкой для редактирования этой записи
регистрации пользователей, чтобы любой желающий мог создать свою учетную запись в Learning Log и ввести собственный набор тем и записей.
Упражнения
19-1. Блог: создайте новый проект Django с именем Blog. Создайте в проекте приложение с именем blogs и моделью BlogPost. Модель должна содержать такие поля, как title, text и date_added. Создайте суперпользователя для проекта и воспользуйтесь административным сайтом для создания пары коротких сообщений. Создайте домашнюю страницу, на которой выводятся все сообщения в хронологическом порядке.
Создайте одну форму для создания новых сообщений и другую форму для редактирования существующих сообщений. Заполните формы и убедитесь в том, что они работают.
Создание учетных записей пользователей
В этом разделе мы создадим систему регистрации и авторизации пользователей, чтобы люди могли создать учетную запись, начать и завершать сеанс работы с приложением. Для всей функциональности, относящейся к работе с пользователями, будет создано отдельное приложение. Мы также слегка изменим модель Topic, чтобы каждая тема была связана с конкретным пользователем.
Приложение users
Начнем с создания нового приложения users командой startapp:
(ll_env)learning_log$ python manage.py startapp users
(ll_env)learning_log$ ls
(1) db.sqlite3 learning_log learning_logs ll_env manage.py users
(ll_env)learning_log$ ls users
(2)admin.py __init__.py migrations models.py tests.py views.py
Эта команда создает новый каталог с именем users (1) , структура которого повторяет структуру каталогов приложения learning_logs (2).
Добавление пользователей в settings.py
Новое приложение необходимо добавить в settings.py:
settings.py
...
INSTALLED_APPS = (
...
# My apps
'learning_logs',
. .'users',
)
...
Django включает приложение users в общий проект.
Включение URL-адресов из users
Затем необходимо изменить корневой файл urls.py, чтобы он включал URL-адреса, написанные для приложения users:
urls.py
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
. .url(r'^users/', include('users.urls', namespace='users')),
url(r'', include('learning_logs.urls', namespace='learning_logs')),
]