Валидаторы

Написание валидаторов

Валидатор - это вызываемый объект, который принимает значение и выдает сообщение ValidationError, если оно не соответствует некоторым критериям. Валидаторы могут быть полезны для повторного использования логики проверки между различными типами полей.

Например, вот валидатор, который допускает только четные числа:

from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _


def validate_even(value):
    if value % 2 != 0:
        raise ValidationError(
            _("%(value)s is not an even number"),
            params={"value": value},
        )

Вы можете добавить это к полю модели через аргумент поля validators:

from django.db import models


class MyModel(models.Model):
    even_field = models.IntegerField(validators=[validate_even])

Поскольку значения преобразуются в Python до запуска валидаторов, вы можете использовать один и тот же валидатор даже с формами:

from django import forms


class MyForm(forms.Form):
    even_field = forms.IntegerField(validators=[validate_even])

Вы также можете использовать класс с методом __call__() для более сложных или настраиваемых валидаторов. Например, RegexValidator использует эту технику. Если в опции поля модели validators используется валидатор на основе класса, необходимо убедиться, что он serializable by the migration framework, добавив методы deconstruct() и __eq__().

Как работают валидаторы

Смотрите form validation для получения дополнительной информации о том, как запускаются валидаторы в формах, и Validating objects для того, как они запускаются в моделях. Обратите внимание, что валидаторы не будут запускаться автоматически при сохранении модели, но если вы используете ModelForm, он будет запускать ваши валидаторы на всех полях, включенных в вашу форму. См. ModelForm documentation для получения информации о том, как валидация модели взаимодействует с формами.

Встроенные валидаторы

Модуль django.core.validators содержит коллекцию вызываемых валидаторов для использования с полями моделей и форм. Они используются внутри модуля, но доступны и для использования с вашими собственными полями. Их можно использовать в дополнение или вместо пользовательских методов field.clean().

RegexValidator

class RegexValidator(regex=None, message=None, code=None, inverse_match=None, flags=0)[исходный код]
Параметры:
  • regex – Если не None, переопределяет regex. Может быть строкой регулярного выражения или предварительно скомпилированным регулярным выражением.
  • message – Если не None, переопределяет message.
  • code – Если не None, переопределяет code.
  • inverse_match – Если не None, переопределяет inverse_match.
  • flags – Если не None, переопределяется flags. В этом случае regex должно быть строкой регулярного выражения, иначе возникает TypeError.

RegexValidator ищет в предоставленном value заданное регулярное выражение с re.search(). По умолчанию выдает ValidationError с message и code, если совпадение не найдено. Его поведение можно изменить, установив inverse_match в True, в этом случае ValidationError будет вызвано, когда совпадение найдено.

regex

Шаблон регулярного выражения для поиска в пределах предоставленного value, используя re.search(). Это может быть строка или предварительно скомпилированное регулярное выражение, созданное с помощью re.compile(). По умолчанию используется пустая строка, которая будет найдена во всех возможных value.

message

Сообщение об ошибке, используемое ValidationError при неудачной валидации. По умолчанию имеет значение "Enter a valid value".

code

Код ошибки, используемый ValidationError при неудачной валидации. По умолчанию "invalid".

inverse_match

Режим соответствия для regex. По умолчанию False.

flags

regex flags используется при компиляции строки регулярного выражения regex. Если regex является предварительно скомпилированным регулярным выражением, а flags переопределяется, то повышается значение TypeError. По умолчанию используется значение 0.

EmailValidator

class EmailValidator(message=None, code=None, allowlist=None)[исходный код]
Параметры:
  • message – Если не None, переопределяет message.
  • code – Если не None, переопределяет code.
  • allowlist – Если не None, переопределяет allowlist.

EmailValidator гарантирует, что значение выглядит как email, и вызывает ValidationError с message и code, если это не так. Значения длиной более 320 символов всегда считаются недопустимыми.

message

Сообщение об ошибке, используемое ValidationError при неудачной валидации. По умолчанию имеет значение "Enter a valid email address".

code

Код ошибки, используемый ValidationError при неудачной валидации. По умолчанию "invalid".

allowlist

Список разрешенных почтовых доменов. По умолчанию регулярное выражение (атрибут domain_regex) используется для проверки всего, что появляется после знака @. Однако, если эта строка появляется в allowlist, эта проверка обходится. Если атрибут не указан, по умолчанию allowlist используется ['localhost']. Другие домены, не содержащие точку, не пройдут проверку, поэтому при необходимости их нужно добавить в allowlist.

Changed in Django 3.2.20:

В старых версиях допустимыми могли считаться значения длиной более 320 символов.

URLValidator

class URLValidator(schemes=None, regex=None, message=None, code=None)[исходный код]

Подкласс RegexValidator, который гарантирует, что значение выглядит как URL, и выдает код ошибки 'invalid', если это не так. Значения длиннее max_length символов всегда считаются недопустимыми.

Loopback-адреса и зарезервированные IP-пространства считаются действительными. Поддерживаются буквенные IPv6-адреса (RFC 3986#section-3.2.2) и домены Unicode.

В дополнение к необязательным аргументам своего родительского класса RegexValidator, URLValidator принимает дополнительный необязательный атрибут:

schemes

Список схем URL/URI для проверки. Если список не указан, по умолчанию используется ['http', 'https', 'ftp', 'ftps']. В качестве справки, на сайте IANA приведен полный список valid URI schemes.

max_length
New in Django 3.2.20.

Максимальная длина значений, которые могут считаться допустимыми. По умолчанию - 2048 символов.

Changed in Django 3.2.20:

В старых версиях допустимыми могли считаться значения длиной более 2048 символов.

validate_email

validate_email

Экземпляр EmailValidator без каких-либо настроек.

validate_slug

validate_slug

Экземпляр RegexValidator, который гарантирует, что значение состоит только из букв, цифр, подчеркивания или дефиса.

validate_unicode_slug

validate_unicode_slug

Экземпляр RegexValidator, который гарантирует, что значение состоит только из букв Юникода, цифр, подчеркиваний или дефисов.

validate_ipv4_address

validate_ipv4_address[исходный код]

Экземпляр RegexValidator, который гарантирует, что значение выглядит как IPv4-адрес.

validate_ipv6_address

validate_ipv6_address[исходный код]

Использует django.utils.ipv6 для проверки достоверности IPv6-адреса.

validate_ipv46_address

validate_ipv46_address[исходный код]

Использует validate_ipv4_address и validate_ipv6_address, чтобы убедиться, что значение является действительным IPv4 или IPv6 адресом.

validate_comma_separated_integer_list

validate_comma_separated_integer_list

Экземпляр RegexValidator, который гарантирует, что значение представляет собой список целых чисел, разделенных запятой.

int_list_validator

int_list_validator(sep=',', message=None, code='invalid', allow_negative=False)[исходный код]

Возвращает экземпляр RegexValidator, который гарантирует, что строка состоит из целых чисел, разделенных sep. Он допускает отрицательные целые числа, когда allow_negative равно True.

MaxValueValidator

class MaxValueValidator(limit_value, message=None)[исходный код]

Вызывает ValidationError с кодом 'max_value', если value больше limit_value, который может быть вызываемым.

MinValueValidator

class MinValueValidator(limit_value, message=None)[исходный код]

Вызывает ValidationError с кодом 'min_value', если value меньше limit_value, который может быть вызываемым.

MaxLengthValidator

class MaxLengthValidator(limit_value, message=None)[исходный код]

Вызывает ValidationError с кодом 'max_length', если длина value больше limit_value, который может быть вызываемым.

MinLengthValidator

class MinLengthValidator(limit_value, message=None)[исходный код]

Вызывает ValidationError с кодом 'min_length', если длина value меньше limit_value, который может быть вызываемым.

DecimalValidator

class DecimalValidator(max_digits, decimal_places)[исходный код]

Вызывает ValidationError со следующими кодами:

  • 'max_digits', если количество цифр больше max_digits.
  • 'max_decimal_places' если количество десятичных знаков больше decimal_places.
  • 'max_whole_digits', если количество целых цифр больше, чем разница между max_digits и decimal_places.

FileExtensionValidator

class FileExtensionValidator(allowed_extensions, message, code)[исходный код]

Вызывает ошибку ValidationError с кодом 'invalid_extension', если расширение value.name (value является File) не найдено в allowed_extensions. Расширение сравнивается регистронезависимо с allowed_extensions.

Предупреждение

Не полагайтесь на проверку расширения файла для определения его типа. Файлы могут быть переименованы и иметь любое расширение, независимо от того, какие данные они содержат.

validate_image_file_extension

validate_image_file_extension[исходный код]

Использует Pillow, чтобы убедиться, что value.name (value является File) имеет a valid image extension.

ProhibitNullCharactersValidator

class ProhibitNullCharactersValidator(message=None, code=None)[исходный код]

Вызывает ошибку ValidationError, если str(value) содержит один или несколько нулевых символов ('\x00').

Параметры:
  • message – Если не None, переопределяет message.
  • code – Если не None, переопределяет code.
message

Сообщение об ошибке, используемое ValidationError при неудачной валидации. По умолчанию имеет значение "Null characters are not allowed.".

code

Код ошибки, используемый ValidationError при неудачной валидации. По умолчанию "null_characters_not_allowed".

StepValueValidator

New in Django 4.1.
class StepValueValidator(limit_value, message=None)[исходный код]

Вызывает ошибку ValidationError с кодом 'step_size', если value не является целым кратным limit_value, которое может быть плавающим, целым или десятичным значением или вызываемой переменной.

Вернуться на верх