Определение форм Django

Последнее обновление: 20.08.2022

Django предоставляет специальные возможности по работе с формами, которые позволяют определять функциональность форм в одном месте и использовать многократно в разных местах, упрощают валидацию данных, помогают связывать формы с моделями и многое другое.

Каждая форма определяется в виде отдельного класса, который расширяет класс forms.Form. Классы размещаются внутри проекта, где они используются. Нередко они помещаются в отдельный файл, который называется, к примеру, forms.py. Однако также формы могут размещаться внутри уже имеющихся в приложении файлов, например, в views.py или models.py.

Например, создадим в приложении новый файл forms.py и поместим в него следующий код:

from django import forms

class UserForm(forms.Form):
    name = forms.CharField()
    age = forms.IntegerField()

Класс формы называется UserForm. Он определяет два поля. Поле name представляет тип forms.CharField и будет генерировать поле input type="text". Поле age представляет тип forms.IntegerField и будет генерировать поле input type="number". То есть первое поле для ввода текста, а второе для ввода чисел.

Определение форм Django и класс forms.Form

Далее в файле views.py определим следующее представление:

from django.shortcuts import render
from .forms import UserForm

def index(request):
    userform = UserForm()
    return render(request, "index.html", {"form": userform})

Здесь объект формы передается в шаблон index.html в виде переменной form.

В файле urls.py пропишем маршрут для этого представления:

from django.urls import path
from hello import views
 
urlpatterns = [
    path("", views.index),
]

И определим следующий шаблон index.html:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>METANIT.COM</title>
</head>
<body>
    <table>
        {{ form }}
    </table>
</body>
</html>

В итоге из переменной form будет генерироваться следующий код html:

<tr><th><label for="id_name">Name:</label></th><td><input type="text" name="name" required id="id_name" /></td></tr>
<tr><th><label for="id_age">Age:</label></th><td><input type="number" name="age" required id="id_age" /></td></tr>
Формы в Django

Получение POST-запроса

Теперь с помощью форм Django определим полнофункциональную форму, с которой можно отправлять данные на сервер.

Вначале изменим шаблон index.html:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>METANIT.COM</title>
</head>
<body>
    <form method="POST">
        {% csrf_token %}
    <table>
        {{ form }}
    </table>
    <input type="submit" value="Send" >
</form>
</body>
</html>

Для создания формы здесь использован стандартный элемент html <form>. В начале формы помещен встроенный тег Django {% csrf_token %}, который позволяет защитить приложение от CSRF-атак, добавляя в форму в виде скрытого поля csrf-токен.

Внизу формы определена кнопка для отправки данной формы на сервер.

Теперь изменим представление в файле views.py:

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.

Если запрос типа POST, то через объект request.POST получаем отправленные данные формы. Мы можем получить эти данные по отдельности для каждого поля формы. После этого отправляем пользователю сообещние через объект HttpResponse. В принципе тут можно было бы сделать переадресацию или использовать другой шаблон для генерации ответа.

Если запрос представляет тип GET, то создаем объект UserForm - форму для ввода данных и отправляем ее в составе веб-страницы index.html.

Таким образом, при обращении к приложению мы вначале увидим форму ввода. Введем в нее некоторые данные:

Обработка ввода в формах Django

После нажатия на кнопку введенные данные в запросе POST опять же уйдут преставлению index, которое обработает их и в ответ отправить пользователю сообщение с введенным именем:

Запросы POST в формах Django
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850