DomainNameValidator

Валидатор DomainNameValidator применяется к полям форм Django для проверки корректности доменных имен. Валидатор проверяет, что строка соответствует правилам DNS - состоит из допустимых символов, содержит точки между уровнями домена и имеет корректную структуру. Он позволяет указать список разрешенных доменных зон и настроить строгость проверки.

Синтаксис

pythonfrom django.core.validators import DomainNameValidator

DomainNameValidator(
  message="Введите корректное доменное имя",
  code="invalid",
  allowed_tlds=["com", "org", "ru", "net"],
  allow_unicode=False
)

Параметры

Валидатор принимает следующие параметры:

Пример . Использование в форме

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

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

class DomainForm(forms.Form):
  domain = forms.CharField(
    max_length=100,
    validators=[
      DomainNameValidator(
        message="Введите корректное доменное имя",
        allowed_tlds=["com", "org", "ru", "net"]
      )
    ],
    help_text="Введите домен без http://"
  )

Пример . С проверкой на Unicode

Разрешим использование Unicode-символов в доменных именах:

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

class UnicodeDomainForm(forms.Form):
  domain = forms.CharField(
    max_length=100,
    validators=[
      DomainNameValidator(
        allow_unicode=True,
        message="Доменное имя содержит недопустимые символы"
      )
    ]
  )

Валидация данных в представлении

Используем форму с валидатором в представлении для проверки введенного домена:

pythonfrom django.shortcuts import render
from .forms import DomainForm

def check_domain(request):
  res = None
  if request.method == "POST":
    form = DomainForm(request.POST)
    if form.is_valid():
      domain = form.cleaned_data["domain"]
      res = f"Домен {domain} прошел валидацию"
  else:
    form = DomainForm()
  return render(request, "domain.html", {"form": form, "result": res})

Пример . С ошибкой валидации

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

pythonfrom django.core.validators import DomainNameValidator
from django.core.exceptions import ValidationError

validator = DomainNameValidator(allowed_tlds=["com", "org"])

try:
  validator("invalid domain")
except ValidationError as e:
  print(e.message)

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

python"Enter a valid domain name"

Валидация списка доменов

Создадим поле, которое принимает несколько доменов через запятую, и применим валидатор к каждому:

pythonfrom django import forms
from django.core.validators import DomainNameValidator, validate_comma_separated_integer_list

class MultipleDomainForm(forms.Form):
  domains = forms.CharField(
    max_length=500,
    validators=[
      validate_comma_separated_integer_list  # Замените на свою валидацию списка
    ],
    help_text="Введите домены через запятую"
  )
  
  def clean_domains(self):
    data = self.cleaned_data["domains"]
    validator = DomainNameValidator()
    domains = [d.strip() for d in data.split(",")]
    for domain in domains:
      validator(domain)
    return data

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

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