Использование в формах РОSТ-запросов
В форму, которую мы создали в предыдущем разделе, пользователь может только вводить свои данные. Давайте с помощью Django создадим полнофункциональную форму, в которую можно не только вводить данные, но и отправлять их на сервер.
Для этого мы можем изменить шаблон index.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Учу Django</title>
</head>
<body>
<form method="POST">
{% csrf_token %}
<table>
{{ form.as_table }}
</table>
<input type="submit" value="Send" >
</form>
</body>
</html>
Для создания формы здесь использован стандартный элемент НТМL <form>. В начале формы помещен встроенный тег Django {% csrf_token %}, который позволяет защитить приложение от CSRF-aтaк, добавляя в форму CSRF-токен в виде скрытого поля. В нижней части формы помещена кнопка для отправки содержимого этой формы на сервер.
CSRF (Cross-Site Request Forgery, XSRF) - опаснейшая атака, которая приводит к тому, что хакер может выполнить на неподготовленном сайте массу различных действий от имени других зарегистрированных посетителей.
Далее в представлении (в файле crud/views.py) определим следующий код для функции index():
from django.shortcuts import render
from django.http import HttpResponse
from .forms import UserForm
def index(request):
if request.method == 'POST':
name = request.POST.get('name') # получить значение поля Имя
age = request.POST.get('age') # получить значение поля Возраст
return HttpResponse(f'<h2>Привет, {name}, твой возраст: {age}</h2>')
else:
userform = UserForm()
return render(request, 'index.html', {'form': userform})
Разберемся, какие действия запрограммированы в этом коде. Представление обрабатывает сразу два типа запросов: GET и POST. Для определения типа запроса делается проверка значения request.method в структуре if ... else.
Если запрос представляет тип GET (ветка else), то мы просто формируем пользовательскую форму userform и отправляем ее для ввода данных в шаблон index.html.
Таким образом, при первом обращении к приложению мы вначале увидим сформированную нами форму ввода:
Если запрос будет иметь тип POST (request.method == 'POST'), то это данные формы, отправляемые по нажатию кнопки Отправить. В этом случае отправляемые из формы данные присваиваются переменным name и age. После этого результирующая f-строка отправляется через объект HttpResponse.
В нашем случае ответ отправляется пользователю на ту же НТМL-страницу:
Конечно, мы здесь реализовали простейший вариант, когда все действия совершаются в пределах одной страницы. В реально работающих приложениях делается либо переадресация (данные отправляются на другую страницу), или они записываются в базу данных, что мы и сделаем в последующих уроках курса.