Валидатор validate_domain_name

Валидатор validate_domain_name применяется к полям форм Django для проверки, является ли переданное значение корректным доменным именем. Он проверяет, соответствует ли строка правилам DNS, включая допустимые символы, длину сегментов и общую длину домена. Валидатор используется по умолчанию в полях типа URLField и EmailField, но может быть применен и отдельно к любому текстовому полю.

Основные параметры валидатора: allow_unicode (разрешает использование Unicode-символов), message (кастомное сообщение об ошибке) и code (код ошибки). По умолчанию allow_unicode имеет значение False, что ограничивает домены только ASCII-символами.

Синтаксис

pythonfrom django.core.validators import validate_domain_name
from django import forms

class MyForm(forms.Form):
  domain = forms.CharField(validators=[validate_domain_name])

Пример

Создадим форму для ввода доменного имени и проверим ее работу с корректным значением:

pythonfrom django.core.validators import validate_domain_name
from django import forms

class DomainForm(forms.Form):
  domain = forms.CharField(
    max_length=100,
    validators=[validate_domain_name],
    label="Domain name"
  )

# Valid domain
form = DomainForm({'domain': 'example.com'})
if form.is_valid():
  res = form.cleaned_data['domain']
  print(res)

Результат выполнения кода:

python"example.com"

Пример

Попробуем передать в форму некорректное доменное имя с недопустимым символом:

pythonfrom django.core.validators import validate_domain_name
from django import forms

class DomainForm(forms.Form):
  domain = forms.CharField(
    max_length=100,
    validators=[validate_domain_name],
    label="Domain name"
  )

# Invalid domain (underscore not allowed)
form = DomainForm({'domain': 'my_site.com'})
if not form.is_valid():
  res = form.errors['domain']
  print(res)

Результат выполнения кода:

python"Enter a valid domain name."

Пример

Используем валидатор с поддержкой Unicode-символов для проверки доменов с национальными символами:

pythonfrom django.core.validators import validate_domain_name
from django import forms

class UnicodeDomainForm(forms.Form):
  domain = forms.CharField(
    max_length=100,
    validators=[validate_domain_name(allow_unicode=True)],
    label="Domain name"
  )

# Unicode domain (example with Russian characters)
form = UnicodeDomainForm({'domain': 'пример.рф'})
if form.is_valid():
  res = form.cleaned_data['domain']
  print(res)

Результат выполнения кода:

python"пример.рф"

Пример

Добавим кастомное сообщение об ошибке для валидатора:

pythonfrom django.core.validators import validate_domain_name
from django import forms

class CustomDomainForm(forms.Form):
  domain = forms.CharField(
    max_length=100,
    validators=[
      validate_domain_name(
        message="Please enter a valid domain name"
      )
    ],
    label="Domain name"
  )

# Invalid domain
form = CustomDomainForm({'domain': 'invalid domain'})
if not form.is_valid():
  res = form.errors['domain']
  print(res)

Результат выполнения кода:

python"Please enter a valid domain name"

Смотрите также

  • валидатор validate_email,
    который проверяет корректность email-адреса
  • валидатор URLValidator,
    который проверяет корректность URL-адресов
  • валидатор RegexValidator,
    который выполняет проверку по регулярному выражению
  • поле URLField,
    которое использует данный валидатор по умолчанию