Валидация данных

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

Теоретически пользователь может ввести в форму какие угодно данные и отправить их. Однако не все данные бывают уместными или корректными. Например, в поле для возраста пользователь может ввести отрицательное число, что вряд ли может считаться корректным возрастом. В этой связи для проверки корректности вводимых данных используется механизм валидации.

Правила валидации

Основным элементом валидации являются правила, которые задают параметры корректности вводимых данных. Например, для всех полей по умолчанию устанавливается обязательность ввода значения. И при генерации html-кода для поля ввода устанавливается атрибут required. И если мы попробуем отправить форму, если какое-то из ее полей не введено никакого значения, то мы получим ошибку:

параметр required в элементах форм Django

И нам надо будет обязательно ввести какое-то значение в незаполненное поле. Однако это не всегда нужно. Допустим, одно поле может иметь, а может не иметь значение. В этом случае мы можем отключить атрибут 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)

is_valid

Выше рассмотренные атрибуты позволяют валидировать значения при вводе на стороне клиента. Однако практически пользователи, имея определенные навыки, могут все равно отправить форму с заведомо некорректными данными. Например, через инструменты для разработчиков в веб-браузере можно подправить исходный код формы, добавив ей атрибут 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>
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850