Глава 19 • Учетные записи пользователей
мой; в данном случае данные возвращаются функции представления
new_topic()
.
Аргумент
method
приказывает браузеру отправить данные в запросе типа POST.
Django использует шаблонный тег
{%
csrf_token
%}
для предотвращения по-
пыток получения несанкционированного доступа к серверу (атаки такого рода
называются
межсайтовой подделкой запросов
). В точке
отображается форма;
это наглядный пример того, насколько легко в Django выполняются такие стан-
дартные операции, как отображение формы. Чтобы автоматически создать все
поля, необходимые для отображения формы, достаточно включить шаблонную
переменную
{{
form.as_p
}}
. Модификатор
as_p
приказывает Django отобра-
зить все элементы формы в формате абзацев — это простой способ аккуратного
отображения формы.
Django не создает кнопку отправки данных для форм, поэтому мы определяем ее
в точке
.
Создание ссылки на страницу new_topic
Далее ссылка на страницу
new_topic
создается на странице
topics
:
topics.html
{% extends "learning_logs/base.html" %}
{% block content %}
Topics
Add a new topic:
{% endblock content %}
Разместите ссылку после списка существующих тем. Полученная форма изобра-
жена на рис. 19.1. Воспользуйтесь ею и добавьте несколько своих тем.
Рис. 19.1.
Страница для добавления новой темы
Редактирование данных
413
Добавление новых записей
Теперь, когда пользователь может добавлять новые темы, он также захочет добав-
лять новые записи. Мы снова определим URL, напишем новую функцию и шаблон
и создадим ссылку на страницу. Но сначала нужно добавить в
forms .py
еще один
класс.
Класс EntryForm
Мы должны создать форму, связанную с моделью
Entry
, но более специализиро-
ванную по сравнению с
TopicForm
:
forms.py
from django import forms
from .models import Topic, Entry
class TopicForm(forms.ModelForm):
...
class EntryForm(forms.ModelForm):
class Meta:
model = Entry
fields = ['text']
labels = {'text': ''}
widgets = {'text': forms.Textarea(attrs={'cols': 80})}
Сначала в команду
import
к
Topic
добавляется
Entry
. Новый класс
EntryForm
на-
следует от
forms.ModelForm
и содержит вложенный класс
Meta
с указанием модели,
на которой он базируется, и поле, включаемое в форму. Полю
'text'
снова назна-
чается пустая надпись
.
В точке
включается атрибут
widgets
.
Виджет
(widget) представляет собой эле-
мент формы HTML: однострочное или многострочное текстовое поле, раскрываю-
щийся список и т. д. Включая атрибут
widgets
, вы можете переопределить виджеты,
выбранные Django по умолчанию. Приказывая Django использовать элемент
forms.
Textarea
, мы настраиваем виджет ввода для поля
'text'
, чтобы ширина текстовой
области составляла 80 столбцов вместо значения по умолчанию 40. У пользователя
будет достаточно места для создания содержательных записей.
URL-адрес для new_entry
Необходимо включить аргумент
topic_id
в URL-адрес для создания новой записи,
потому что запись должна ассоциироваться с конкретной темой. Вот как выглядит
URL, который мы добавляем в
learning_logs/urls .py
:
urls.py
...
urlpatterns = [
...
# Страница для добавления новой записи
url(r'^new_entry/(?P\d+)/$', views.new_entry, name='new_entry'),
]
414
Достарыңызбен бөлісу: |