Валидаторы

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

Валидатор - это вызываемый элемент, который принимает значение и выдает ошибку 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.
message

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

code

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

allowlist

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

Не рекомендуется, начиная с версии 3.2: Параметр whitelist является устаревшим. Вместо него используйте allowlist. Недокументированный атрибут domain_whitelist является устаревшим. Вместо него используйте domain_allowlist.

URLValidator

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

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

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

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

schemes

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

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".

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