Валидаторы¶
Создание валидаторов¶
Валидатор — это вызываемый объект, который принимает значение и выдает 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, то он запустит ваши валидаторы для всех полей формы. Обратитесь к документации на модельные формы для получения информации о том, как валидаторы модели взаимодействуют с формами.
Встроенные валидаторы¶
Модуль 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.
RegexValidatorищет предоставленноезначениедля данного регулярного выражения с помощьюre.search(). По умолчанию вызываетValidationErrorсmessageиcode, если совпадение не найдено. Его поведение можно инвертировать, установив дляinverse_matchзначениеTrue, и в этом случаеValidationErrorвызывается, когда соответствие обнаружено.- regex¶
Шаблон регулярного выражения для поиска в пределах предоставленного значения с использованием
re.search(). Это может быть строка или предварительно скомпилированное регулярное выражение, созданное с помощьюre.compile(). По умолчанию используется пустая строка, которая будет найдена во всех возможных значениях.
- message¶
Сообщение об ошибке, используемое исключением
ValidationError, если проверка не прошла. По умолчанию,"Enter a valid value".
- code¶
Код ошибки, используемый исключением
ValidationError, если проверка не прошла. По умолчанию"invalid".
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) используется для проверки всего, что появляется после знака@. Однако, если эта строка появляется в «белом списке», эта проверка пропускается. Если этот параметр не указан, белый список по умолчанию — это['localhost']. Другие домены, не содержащие точку, не пройдут проверку, поэтому при необходимости вам придется добавить их в «белый список».
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 (RFC 3986 Section 3.2.2), так и домены Unicode.
В дополнение к необязательным аргументам родительского класса
RegexValidator,URLValidatorпринимает дополнительный необязательный атрибут:- schemes¶
Список разрешенных для URL/URI протоколов. По умолчанию
['http', 'https', 'ftp', 'ftps']. Сайт IANA Web предоставляет полный список валидных протоколов 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, который проверяет, что значение содержит только Unicode буквы, числа, символы подчёркивания или тире.
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больше, чемmax_value.
MinValueValidator¶
- class MinValueValidator(limit_value, message=None)¶
Вызывает исключение
ValidationErrorс кодом'min_value', еслиvalueменьше, чемmin_value.
MaxLengthValidator¶
- class MaxLengthValidator(limit_value, message=None)¶
Вызывает исключение
ValidationErrorс кодом'max_length', если длинаvalueбольше, чемmax_length.
MinLengthValidator¶
- class MinLengthValidator(limit_value, message=None)¶
Вызывает исключение
ValidationErrorс кодом'min_length', если длинаvalueменьше, чем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)¶
Вызывает
ValidationErrorс кодом'invalid_extension', если расширениеvalue.name(valueявляетсяFile) не найдено вallowed_extensions. Расширение сравнивается регистронезависимо сallowed_extensions.Предупреждение
Не полагайтесь на проверку расширения файла, проверяя его тип. Файл может быть переименован и расширение никак не определяет его содержимое.
validate_image_file_extension¶
- validate_image_file_extension¶
Использует Pillow, чтобы убедиться что
value.name(valueявляетсяFile) содержит правильное расширение для изображения.
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.