Валидаторы
Написание валидаторов
Валидатор — это вызываемый объект, который принимает значение и вызывает исключение 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 используется валидатор на основе класса, необходимо убедиться, что он сериализуем средствами системы миграций, добавив методы deconstruct() и __eq__().
Как запускаются валидаторы
Дополнительные сведения о запуске валидаторов в формах см. в разделе проверка форм, а о запуске в моделях — в разделе Проверка объектов. Обратите внимание, что валидаторы не запускаются автоматически при сохранении модели. Однако при использовании ModelForm валидаторы будут запущены для всех полей, включённых в форму. Сведения о взаимодействии проверки моделей с формами см. в документации по ModelForm.
Встроенные валидаторы
Модуль django.core.validators содержит набор вызываемых валидаторов для использования с полями моделей и форм. Они используются внутри Django, но доступны и для использования в собственных полях. Их можно использовать вместе с пользовательскими методами 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.
-
regex – Если значение не
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. Еслиregex— предварительно скомпилированное регулярное выражение, а значениеflagsпереопределено, вызывается исключениеTypeError. По умолчанию —0.
EmailValidator
-
class EmailValidator(message=None, code=None, allowlist=None)[источник] -
- Параметры:
EmailValidatorпроверяет, что значение похоже на адрес электронной почты, и если это не так, вызывает исключениеValidationErrorс сообщениемmessageи кодомcode. Значения длиной более 320 символов всегда считаются недопустимыми.-
message -
Сообщение об ошибке, используемое в
ValidationError, если проверка не пройдена. По умолчанию —"Enter a valid email address".
-
code -
Код ошибки, используемый в
ValidationError, если проверка не пройдена. По умолчанию —"invalid".
-
allowlist -
Список разрешённых доменов электронной почты. По умолчанию для проверки текста после знака
@используется регулярное выражение (атрибутdomain_regex). Однако если эта строка присутствует вallowlist, проверка не выполняется. Если значение не указано, по умолчаниюallowlistравно['localhost']. Другие домены без точки не пройдут проверку, поэтому при необходимости их нужно добавить вallowlist.
DomainNameValidator
-
class DomainNameValidator(accept_idna=True, message=None, code=None)[источник] -
Подкласс
RegexValidator, проверяющий, что значение похоже на доменное имя. Значения длиной более 255 символов всегда считаются недопустимыми. IP-адреса не принимаются в качестве допустимых доменных имён.Помимо необязательных аргументов родительского класса
RegexValidator,DomainNameValidatorпринимает дополнительный необязательный атрибут:-
accept_idna -
Определяет, принимать ли интернационализированные доменные имена, то есть доменные имена, содержащие символы, отличные от ASCII. По умолчанию —
True.
-
URLValidator
-
class URLValidator(schemes=None, regex=None, message=None, code=None)[источник] -
Подкласс
RegexValidator, проверяющий, что значение похоже на URL, и если это не так, возвращающий код ошибки'invalid'. Значения длиной болееmax_lengthсимволов всегда считаются недопустимыми.Адреса обратной петли и зарезервированные диапазоны IP считаются допустимыми. Поддерживаются как IPv6-адреса в буквальной записи (раздел 3.2.2 RFC 3986), так и домены в Юникоде.
Помимо необязательных аргументов родительского класса
RegexValidator,URLValidatorпринимает дополнительный необязательный атрибут:-
schemes -
Список схем URL/URI для проверки. Если список не указан, используется список по умолчанию
['http', 'https', 'ftp', 'ftps']. Для справки на сайте IANA приведён полный список допустимых схем URI.Предупреждение
Значения, начинающиеся с
file:///, не пройдут проверку, даже если указана схемаfile. Допустимые значения должны содержать хост.
-
max_length -
Максимальная длина значений, которые могут считаться допустимыми. По умолчанию — 2048 символов.
-
validate_email
-
validate_email -
Экземпляр
EmailValidatorбез дополнительных настроек.
validate_domain_name
-
validate_domain_name -
Экземпляр
DomainNameValidatorбез дополнительных настроек.
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[источник] -
Для проверки корректности IPv6-адреса используется
django.utils.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)[источник] -
Если
valueбольшеlimit_value(которое может быть вызываемым объектом), вызывается исключениеValidationErrorс кодом'max_value'.
MinValueValidator
-
class MinValueValidator(limit_value, message=None)[источник] -
Если
valueменьшеlimit_value(которое может быть вызываемым объектом), вызывается исключениеValidationErrorс кодом'min_value'.
MaxLengthValidator
-
class MaxLengthValidator(limit_value, message=None)[источник] -
Если длина
valueпревышаетlimit_value(которое может быть вызываемым объектом), вызывается исключениеValidationErrorс кодом'max_length'.
MinLengthValidator
-
class MinLengthValidator(limit_value, message=None)[источник] -
Если длина
valueменьшеlimit_value(которое может быть вызываемым объектом), вызывается исключениеValidationErrorс кодом'min_length'.
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)[источник] -
Если расширение
value.name(valueявляетсяFile) не найдено вallowed_extensions, вызывается исключениеValidationErrorс кодом'invalid_extension'. Расширение сравнивается без учёта регистра сallowed_extensions.Предупреждение
Не полагайтесь на проверку расширения файла при определении его типа. Файлам можно присвоить любое расширение независимо от содержащихся в них данных.
validate_image_file_extension
-
validate_image_file_extension[источник] -
С помощью Pillow проверяет, что у
value.name(valueявляетсяFile) допустимое расширение файла изображения.
ProhibitNullCharactersValidator
-
class ProhibitNullCharactersValidator(message=None, code=None)[источник] -
Если
str(value)содержит один или несколько нулевых символов ('\x00'), вызывается исключениеValidationError.- Параметры:
-
message -
Сообщение об ошибке, используемое в
ValidationError, если проверка не пройдена. По умолчанию —"Null characters are not allowed.".
-
code -
Код ошибки, используемый в
ValidationError, если проверка не пройдена. По умолчанию —"null_characters_not_allowed".
StepValueValidator
-
class StepValueValidator(limit_value, message=None, offset=None)[источник] -
Если
valueне кратноlimit_value(которое может быть числом с плавающей точкой, целым числом, десятичным значением или вызываемым объектом), вызывается исключениеValidationErrorс кодом'step_size'. Если заданоoffset, проверка выполняется относительно суммыlimit_valueиoffset. Например, дляStepValueValidator(3, offset=1.4)допустимы значения1.4,4.4,7.4,10.4и так далее.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/6.0/ref/validators/