М97 Изучаем Python: программирование игр, визуализация данных, веб-приложения



Pdf көрінісі
бет310/334
Дата18.10.2023
өлшемі6,19 Mb.
#186390
1   ...   306   307   308   309   310   311   312   313   ...   334
Байланысты:
Изучаем Python

views.py
from django.shortcuts import render, redirect
from .models import Topic
from .forms import TopicForm
...
def new_topic(request):
"""Определяет новую тему."""

if request.method != 'POST':
# Данные не отправлялись; создается пустая форма.

form = TopicForm()
else:
# Отправлены данные POST; обработать данные.

form = TopicForm(data=request.POST)

if form.is_valid():

form.save()

return redirect('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. Когда 


426
Глава 19 • Учетные записи пользователей
пользователь уже заполнил и отправил форму, его браузер отправляет запрос 
POST. В зависимости от типа запроса мы определяем, запросил ли пользователь 
пустую форму (запрос GET) или предлагает обработать заполненную форму (за-
прос POST).
Метод запроса — GET или POST — проверяется в точке 

. Если метод запроса от-
личен от POST, вероятно, используется запрос GET, поэтому необходимо вернуть 
пустую форму (даже если это запрос другого типа, это все равно безопасно). Мы 
создаем экземпляр 
TopicForm

, сохраняем его в переменной 
form
и отправляем 
форму шаблону в словаре 
context

. Так как при создании 
TopicForm
аргументы 
не передавались, Django создает пустую форму, которая заполняется пользова-
телем.
Если используется метод запроса POST, выполняется блок 
else
, который об-
рабатывает данные, отправленные в форме. Мы создаем экземпляр 
TopicForm

и передаем ему данные, введенные пользователем, хранящиеся в 
request.POST

Возвращаемый объект 
form
содержит информацию, отправленную пользова-
телем.
Отправленную информацию нельзя сохранять в базе данных до тех пор, пока она 
не будет проверена 

. Функция 
is_valid()
проверяет, что все обязательные поля 
были заполнены (все поля формы по умолчанию являются обязательными), а вве-
денные данные соответствуют типам полей — например, что длина текста меньше 
200 символов, как было указано в файле 
models .py
в главе 18. Автоматическая про-
верка избавляет нас от большого объема работы. Если все данные действительны, 
можно вызвать метод 
save()

, который записывает данные из формы в базу 
данных.
После того как данные будут сохранены, страницу можно покинуть. Мы исполь-
зуем вызов 
redirect()

для перенаправления браузера на страницу 
topics
, на 
которой пользователь увидит только что введенную им тему в общем списке тем.
Переменная 
context
определяется в конце функции представления 

, а страница 
строится на базе шаблона 
new_topic .html
, который будет создан на следующем шаге. 
Код размещается за пределами любых блоков 
if
; он выполняется при создании 
пустой формы, а также при определении того, что отправленная форма была не-
действительной. Недействительная форма включает стандартные сообщения об 
ошибках, чтобы помочь пользователю передать действительные данные.
Шаблон new_topic
Теперь создадим новый шаблон с именем 
new_topic .html
для отображения только 
что созданной формы:


Достарыңызбен бөлісу:
1   ...   306   307   308   309   310   311   312   313   ...   334




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

    Басты бет