Validadores

Escribiendo validadores

Un validador es una función llamable que toma un valor y levanta una ValidationError si no cumple con algunos criterios. Los validadores pueden ser útiles para reutilizar la lógica de validación entre diferentes tipos de campos.

Por ejemplo, aquí tienes un validador que solo permite números pares:

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},
        )

Puedes agregar esto a un campo de modelo mediante el argumento validators del campo:

from django.db import models


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

Because values are converted to Python before validators are run, you can even use the same validator with forms:

from django import forms


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

Puedes utilizar también una clase con un método __call__() para validadores más complejos o configurables. Por ejemplo, la clase RegexValidator utiliza esta técnica. Si se utiliza un validador basado en clases en la opción de campo del modelo validators, asegúrate de que sea serializable por el marco de migración agregando los métodos deconstruct() y __eq__().

Cómo se ejecutan los validadores

Consulte la documentación sobre validación de formularios para obtener más información sobre cómo se ejecutan los validadores en formularios, y Validando objetos para saber cómo se ejecutan en modelos. Ten en cuenta que no se ejecutarán los validadores automáticamente cuando guardes un modelo, pero si estás utilizando una ModelForm, ejecutará tus validadores en cualquier campo que incluyas en tu formulario. Consulta la documentación sobre ModelForm para obtener información sobre cómo interactúa la validación de modelos con los formularios.

Validadores integrados

El módulo django.core.validators contiene una colección de validadores llamables para uso con campos de modelo y formulario. Se utilizan internamente pero están disponibles para su uso en sus propios campos. Pueden usarse además o en lugar de métodos field.clean() personalizados.

RegexValidator

class RegexValidator(regex=None, message=None, code=None, inverse_match=None, flags=0)[fuente]
Parámetros:
  • regex – Si no es None, sobrescribe regex. Puede ser una cadena de expresión regular o una expresión regular pre-compilada.

  • message – Si no es None, sobrescribe message.

  • code – Si no es None, sobrescribe code.

  • inverse_match – Si no es None, sobreescribe inverse_match.

  • flags – Si no es None, sobreescribe flags. En ese caso, regex debe ser una cadena de expresión regular o se levanta un TypeError.

Una instancia de RegexValidator busca la expresión regular proporcionada en el value con re.search(). Por defecto, lanza un ValidationError con message y code si no se encuentra una coincidencia. Su comportamiento puede invertirse estableciendo inverse_match a True, en cuyo caso el ValidationError se lanza cuando se encuentra una coincidencia.

regex

La cadena de expresión regular para buscar dentro del value proporcionado, utilizando re.search(). Puede ser una cadena o una expresión regular pre-compilada creada con re.compile(). Por defecto es la cadena vacía, que se encontrará en cada posible value.

message

El mensaje de error utilizado por el ValidationError si falla la validación. Por defecto es "Enter a valid value".

code

El código de error utilizado por el ValidationError si falla la validación. Por defecto es "invalid".

inverse_match

El modo de coincidencia para regex. Por defecto es False.

flags

Los flags de expresión regular utilizados cuando se compila la cadena de expresión regular regex. Si regex es una expresión regular pre-compilada y se sobreescribe TypeError, se levanta. Por defecto es 0.

EmailValidator

class EmailValidator(message=None, code=None, allowlist=None)[fuente]
Parámetros:
  • message – Si no es None, sobrescribe message.

  • code – Si no es None, sobrescribe code.

  • allowlist – Si no es None, sobreescribe allowlist.

An Validador de Correo Electrónico asegura que un valor tenga el formato de un correo electrónico y lanza una ValidationError con mensaje y código si no lo tiene. Los valores más largos que 320 caracteres siempre se consideran inválidos.

message

El mensaje de error utilizado por ValidationError cuando la validación falla. Por defecto, es "Ingrese una dirección de correo electrónico válida".

code

El código de error utilizado por el ValidationError si falla la validación. Por defecto es "invalid".

allowlist

Lista blanca de dominios de correo electrónico. Por defecto, se utiliza una expresión regular (la atributo domain_regex) para validar lo que aparece después del signo @. Sin embargo, si esa cadena aparece en la lista blanca, esta validación se bypassa. Si no se proporciona, la lista blanca por defecto es ['localhost']. Los dominios que no contienen un punto no pasarán la validación, por lo que necesitarás agregarlos a la lista blanca según sea necesario.

Validador de Nombre de Dominio

class DomainNameValidator(accept_idna=True, message=None, code=None)[fuente]

Una subclase RegexValidator que asegura que un valor tenga el formato de un nombre de dominio. Los valores más largos que 255 caracteres siempre se consideran inválidos. Las direcciones IP no se aceptan como nombres de dominios válidos.

Además de los argumentos opcionales de la clase padre RegexValidator, DomainNameValidator acepta un atributo adicional opcional:

accept_idna

Determina si aceptar nombres de dominio internacionalizados, es decir, nombres de dominio que contienen caracteres no ASCII. Por defecto, es True.

Validador de URL

class URLValidator(schemes=None, regex=None, message=None, code=None)[fuente]

Una subclase RegexValidator que asegura que un valor tenga el formato de una URL y lanza un código de error de 'invalid' si no lo tiene. Los valores más largos que max_length caracteres siempre se consideran inválidos.

Las direcciones IP de bucle de vuelta y los espacios reservados de IP se consideran válidos. Las direcciones IPv6 literales (RFC 3986 Section 3.2.2) y los dominios Unicode también están soportados.

Además de los argumentos opcionales de su clase padre RegexValidator, la clase URLValidator acepta un atributo adicional opcional:

schemes

Lista del esquema URL/URI a validar en contra. Si no se proporciona, la lista por defecto es ['http', 'https', 'ftp', 'ftps']. Como referencia, el sitio web de IANA proporciona una lista completa de esquemas URI válidos.

Advertencia

Los valores que comienzan con file:/// no pasarán la validación incluso cuando se proporciona el esquema file. Los valores válidos deben contener un host.

max_length

La longitud máxima de los valores que podrían considerarse válidos. Por defecto, es 2048 caracteres.

validate_email

validate_email

Una instancia de EmailValidator sin personalizaciones.

validate_domain_name

validate_domain_name

Una instancia de DomainNameValidator sin personalizaciones.

validate_slug

validate_slug

Una instancia de RegexValidator que asegura que un valor consiste solo en letras, números, guiones bajos o guiones.

valida_unicode_slug

validate_unicode_slug

Una instancia de RegexValidator que asegura que un valor consiste solo en letras Unicode, números, guiones bajos o guiones.

validate_ipv4_address

validate_ipv4_address[fuente]

Una instancia de RegexValidator que asegura que un valor tiene el formato de una dirección IPv4.

validate_ipv6_address

validate_ipv6_address[fuente]

Utiliza django.utils.ipv6 para verificar la validez de una dirección IPv6.

validate_ipv46_address

validate_ipv46_address[fuente]

Utiliza tanto validate_ipv4_address como validate_ipv6_address para asegurar que un valor es una dirección IPv4 o IPv6 válida.

validate_comma_separated_integer_list

validate_comma_separated_integer_list

Una instancia de RegexValidator que asegura que un valor es una lista separada por comas de enteros.

int_list_validator

int_list_validator(sep=',', message=None, code='invalid', allow_negative=False)[fuente]

Devuelve una instancia de RegexValidator que asegura que una cadena consiste en enteros separados por sep. Permite números negativos cuando allow_negative es True.

MaxValueValidator

class MaxValueValidator(limit_value, message=None)[fuente]

Lanza un error de validación ValidationError con el código 'max_value' si value es mayor que limit_value, que puede ser una función llamable.

MinValueValidator

class MinValueValidator(limit_value, message=None)[fuente]

Lanza un error de validación ValidationError con el código 'min_value' si value es menor que limit_value, que puede ser una función llamable.

MaxLengthValidator

class MaxLengthValidator(limit_value, message=None)[fuente]

Lanza un error de validación ValidationError con el código 'max_length' si la longitud de value es mayor que limit_value, que puede ser una función llamable.

MinLengthValidator

class MinLengthValidator(limit_value, message=None)[fuente]

Lanza un error de validación ValidationError con el código 'min_length' si la longitud de value es menor que limit_value, que puede ser una función llamable.

DecimalValidator

class DecimalValidator(max_digits, decimal_places)[fuente]

Lanza una ValidationError con los siguientes códigos:

  • 'max_digits' si el número de dígitos es mayor que max_digits.

  • 'max_decimal_places' si el número de decimales es mayor que decimal_places.

  • 'max_whole_digits' si el número de dígitos enteros es mayor que la diferencia entre max_digits y decimal_places.

FileExtensionValidator

class FileExtensionValidator(allowed_extensions, message, code)[fuente]

Lanza una ValidationError con un código de 'invalid_extension' si la extensión de value.name (value es una File) no se encuentra en allowed_extensions. La extensión se compara sin distinguir entre mayúsculas y minúsculas con allowed_extensions.

Advertencia

No te fíes de la validación de la extensión del archivo para determinar el tipo de archivo. Los archivos pueden renombrarse para tener cualquier extensión, independientemente del contenido que contengan.

validate_image_file_extension

validate_image_file_extension[fuente]

Utiliza Pillow para asegurarse de que value.name (value es una File) tenga una extensión de imagen válida.

ProhibitNullCharactersValidator

class ProhibitNullCharactersValidator(message=None, code=None)[fuente]

Lanza una ValidationError si str(value) contiene uno o más caracteres nulos ('\x00').

Parámetros:
  • message – Si no es None, sobrescribe message.

  • code – Si no es None, sobrescribe code.

message

El mensaje de error utilizado por la ValidationError en caso de que la validación falla. Por defecto es "No se permiten caracteres nulos.".

code

El código de error utilizado por la ValidationError en caso de que la validación falla. Por defecto es "caracteres_nulos_no_permitidos".

StepValueValidator

class StepValueValidator(limit_value, message=None, offset=None)[fuente]

Lanza una ValidationError con un código de 'step_size' si value no es un múltiplo integral de limit_value, que puede ser un valor flotante, entero o decimal o una función. Cuando se establece offset, la validación ocurre contra limit_value más offset. Por ejemplo, para StepValueValidator(3, offset=1.4) los valores válidos incluyen 1.4, 4.4, 7.4, 10.4, y así sucesivamente.