Теоретически пользователь может ввести в форму какие угодно данные и отправить их. Однако не все данные бывают уместными или корректными. Например, в поле для возраста пользователь может ввести отрицательное число, что вряд ли может считаться корректным возрастом. В этой связи для проверки корректности вводимых данных используется механизм валидации.
Основным элементом валидации являются правила, которые задают параметры корректности вводимых данных. Например, для всех полей по умолчанию устанавливается обязательность ввода значения. И при генерации html-кода для поля ввода устанавливается атрибут required. И если мы попробуем отправить форму, если какое-то из ее полей не введено никакого значения, то мы получим ошибку:
И нам надо будет обязательно ввести какое-то значение в незаполненное поле. Однако это не всегда нужно. Допустим, одно поле может иметь, а может не иметь значение. В этом случае мы можем отключить атрибут required:
from django import forms class UserForm(forms.Form): name = forms.CharField() age = forms.IntegerField(required=False) email = forms.EmailField(required=False)
Для полей, которые требуют ввода текста, например, CharField
, EmailField
и др., с помощью параметров
max_length и min_length можно задать соответственно максимальную и минимальную длину вводимого текста в символах.
from django import forms class UserForm(forms.Form): name = forms.CharField(min_length=2, max_length=20) email = forms.EmailField(required=False, min_length=7)
При генерации разметки для полей ввода будут устанавливаться атрибуты maxlength
и minlength
.
Для объектов IntegerField, DecimalField и FloatField можно устанавливать параметры max_value и min_value, которые задают соответственно максимально допустимое и минимально допустимое значение.
DecimalField дополнительно может принимать еще параметр decimal_places, который указывает на максимальное количество знаков после запятой.
from django import forms class UserForm(forms.Form): name = forms.CharField() age = forms.IntegerField(min_value=1, max_value=100) weight = forms.DecimalField(min_value=3, max_value=200, decimal_places=2)
Выше рассмотренные атрибуты позволяют валидировать значения при вводе на стороне клиента. Однако практически пользователи, имея определенные навыки, могут все равно отправить форму с заведомо некорректными данными. Например, через инструменты для разработчиков в веб-браузере можно подправить исходный код формы, добавив ей атрибут novalidate, который отключает клиентскую валидацию. Поэтому проверку на валидность данных также надо определять на стороне сервера. Для этого у формы вызывается метод is_valid(), который возвращает True, если данные корректны, и False - если данные некорректны. Чтобы использоать этот метод, надо создать объект формы и передать ей пришедшие из запроса данные.
Итак, определим следующее представление в файле views.py:
from django.shortcuts import render from django.http import HttpResponse from .forms import UserForm def index(request): if request.method == "POST": userform = UserForm(request.POST) if userform.is_valid(): name = userform.cleaned_data["name"] return HttpResponse(f"<h2>Hello, {name}</h2>") else: return HttpResponse("Invalid data") else: userform = UserForm() return render(request, "index.html", {"form": userform})
Если приходит POST-запрос, то в начале заполняем форму пришедшими данными:
userform = UserForm(request.POST)
Потом проверяем их корректность:
if userform.is_valid():
После проверки на валидность мы можем получить данные через объект cleaned_data (если данные корректны):
name = userform.cleaned_data["name"]
Если данные некорректны, можно предусмотреть альтернативный вывод:
return HttpResponse("Invalid data")
Для тестирования формы можно установить у ней атрибут novalidate:
<form method="POST" novalidate> {% csrf_token %} <table> {{ form }} </table> <input type="submit" value="Send" > </form>