Валидаторы¶
Написание валидаторов¶
Валидатор - это вызываемый объект, который принимает значение и выдает сообщение 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"
.
- regex – Если не
EmailValidator
¶
-
class
EmailValidator
(message=None, code=None, allowlist=None)[исходный код]¶ Параметры: 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
¶ Сообщение об ошибке, используемое
ValidationError
при неудачной валидации. По умолчанию имеет значение"Null characters are not allowed."
.
-
code
¶ Код ошибки, используемый
ValidationError
при неудачной валидации. По умолчанию"null_characters_not_allowed"
.
-
StepValueValidator
¶
-
class
StepValueValidator
(limit_value, message=None, offset=None)[исходный код]¶ Вызывает ошибку
ValidationError
с кодом'step_size'
, еслиvalue
не является целым кратнымlimit_value
, которое может быть плавающей, целой или десятичной величиной или вызываемой переменной. Если установлено значениеoffset
, проверка происходит по отношению кlimit_value
плюсoffset
. Например, дляStepValueValidator(3, offset=1.4)
допустимые значения включают1.4
,4.4
,7.4
,10.4
и так далее.Changed in Django 5.0:Был добавлен аргумент
offset
.