Валидатор validate_slug

Валидатор validate_slug используется для проверки того, что строка соответствует формату slug. Slug - это строка, состоящая только из букв латинского алфавита (в нижнем регистре), цифр, дефисов и символов подчеркивания. Этот валидатор часто применяется в формах для полей, которые должны содержать URL-дружественные значения, такие как идентификаторы, названия страниц или категорий. Валидатор вызывается при валидации формы и в случае несоответствия формату выбрасывает исключение ValidationError.

Синтаксис

pythonvalidate_slug(value)

Валидатор принимает один обязательный параметр:

Валидатор не возвращает значение, а в случае ошибки выбрасывает исключение ValidationError с соответствующим сообщением.

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

Рассмотрим пример использования валидатора validate_slug в поле формы:

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

class CategoryForm(forms.Form):
  name = forms.CharField(max_length=50)
  slug = forms.CharField(max_length=50, validators=[validate_slug])
  
  def clean(self):
    cleaned_data = super().clean()
    return cleaned_data

В этом примере поле slug будет проверяться валидатором validate_slug при вызове метода is_valid формы.

Пример . Валидация

Проверим, как работает валидатор на корректных и некорректных данных:

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

# Проверка корректного slug
try:
  validate_slug("my-awesome-category_123")
  print("Validation passed")
except ValidationError as e:
  print(f"Validation error: {e}")
  
# Проверка некорректного slug (с пробелом)
try:
  validate_slug("my awesome category")
  print("Validation passed")
except ValidationError as e:
  print(f"Validation error: {e}")

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

python"Validation passed"
"Validation error: ['Enter a valid “slug” consisting of letters, numbers, underscores or hyphens.']"

Пример . С ModelForm

Валидатор validate_slug также можно использовать в ModelForm для проверки поля модели:

pythonfrom django.db import models
from django import forms
from django.core.validators import validate_slug

class Article(models.Model):
  title = models.CharField(max_length=200)
  slug = models.SlugField(max_length=50)
  
  def __str__(self):
    return self.title

class ArticleForm(forms.ModelForm):
  class Meta:
    model = Article
    fields = ['title', 'slug']
    
  def clean_slug(self):
    slug = self.cleaned_data.get('slug')
    validate_slug(slug)
    return slug

В этом примере валидатор validate_slug вызывается в методе clean_slug, что позволяет выполнить дополнительную проверку поля перед сохранением модели.

Пример . Обработка ошибок

Покажем, как обрабатывать ошибки валидации при работе с формой в представлении:

pythonfrom django.shortcuts import render, redirect
from .forms import CategoryForm

def create_category(request):
  if request.method == 'POST':
    form = CategoryForm(request.POST)
    if form.is_valid():
      # Сохранение категории
      return redirect('category_list')
  else:
    form = CategoryForm()
  return render(request, 'create_category.html', {'form': form})

Если пользователь введет в поле slug недопустимые символы (например, пробелы или специальные знаки), форма не пройдет валидацию, и пользователь увидит сообщение об ошибке.

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

  • валидатор validate_unicode_slug,
    который проверяет строку на соответствие формату slug с поддержкой Unicode
  • валидатор RegexValidator,
    который проверяет строку по регулярному выражению
  • валидатор MaxLengthValidator,
    который проверяет максимальную длину строки
  • валидатор MinLengthValidator,
    который проверяет минимальную длину строки