Книга «Изучаем Python»



Pdf көрінісі
бет248/266
Дата03.03.2023
өлшемі7,86 Mb.
#170986
түріКнига
1   ...   244   245   246   247   248   249   250   251   ...   266
Байланысты:
Изучаем Python. Программирование игр, визуализация данных, веб-приложения ( PDFDrive )


Глава 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
для отображения только 
что созданной формы:
new_topic.html
{% extends "learning_logs/base.html" %}
{% block content %}
Add a new topic:
 

 
{% csrf_token %}
 
{{ form.as_p }}
 


{% endblock content %}
Этот шаблон расширяет 
base .html
, поэтому он имеет такую же базовую структуру, 
как и остальные страницы Learning Log. В точке 

определяется форма HTML. 
Аргумент 
action
сообщает серверу, куда передавать данные, отправленные фор-


412

Достарыңызбен бөлісу:
1   ...   244   245   246   247   248   249   250   251   ...   266




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет