forms.py
from django import forms
from .models import Topic
class TopicForm(forms.ModelForm):
class Meta:
model = Topic
fields = ['text']
labels = {'text': ''}
Сначала импортируется модуль
forms
и модель, с которой мы будем работать:
Topic
. В точке определяется класс с именем
TopicForm
, наследующий от
forms.
ModelForm
. Простейшая версия
ModelForm
состоит из вложенного класса
Meta
,
который сообщает Django, на какой модели должна базироваться форма и какие
поля на ней должны находиться. В точке форма создается на базе модели
Topic
,
а на ней размещается только поле
text
. Код приказывает Django не генериро-
вать подпись для текстового поля.
URL-адрес для new_topic
URL-адрес новой страницы должен быть простым и содержательным, поэтому
после того, как пользователь выбрал команду создания новой темы, он направля-
ется по адресу http://localhost:8000/new_topic/. Ниже приведена схема URL для
страницы
new_topic
, которая добавляется в
learning_logs/urls .py
:
urls.py
...
urlpatterns = [
...
# Страница для добавления новой темы
url(r'^new_topic/$', views.new_topic, name='new_topic'),
]
Эта схема URL будет отправлять запросы функции представления
new_topic()
,
которую мы сейчас напишем.
410 Глава 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
для отображения только
что созданной формы:
Достарыңызбен бөлісу: |