Django 5 для начинающих

Прогресс по курсу:  9/1004

4.1 Формы в Django
5 из 16 шагов пройдено
0 из 48 баллов  получено

Использование в формах РО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-страницу:


Конечно, мы здесь реализовали простейший вариант, когда все действия совершаются в пределах одной страницы. В реально работающих приложениях делается либо переадресация (данные отправляются на другую страницу), или они записываются в базу данных, что мы и сделаем в последующих уроках курса.


  • Комментария
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

https://habr.com/ru/articles/318748/

интересная статья про защиту от CSRF-атак

Если запрос будет иметь типа POST (request.method "POST"),

а лишнее 

@Георгий_Тимофеев, спасибо, исправил.

Предполагаю, что в этом месте должно быть form.as_table иначе будет съезжать и не соответствовать дальнейшим скринам: 

@Максим_Михеев, Похоже что Django 4 по умолчанию выводит поля формы как таблицы, а Django 5 выводит уже как блоки div. Чуть изменили код в лекции, чтобы у всех он был одинаков.

@Илья_Перминов, В 4.1.5 то же самое в двух местах...