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"
. То есть первое поле для ввода текста, а второе для ввода чисел.
Далее в файле 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 определим полнофункциональную форму, с которой можно отправлять данные на сервер.
Вначале изменим шаблон 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.
Таким образом, при обращении к приложению мы вначале увидим форму ввода. Введем в нее некоторые данные:
После нажатия на кнопку введенные данные в запросе POST опять же уйдут преставлению index, которое обработает их и в ответ отправить пользователю сообщение с введенным именем: