SlugField

SlugField - это поле формы, предназначенное для ввода и валидации слаг-строк. Слаг - это часть URL-адреса, которая обычно формируется из заголовка статьи, названия товара или другого текста и содержит только безопасные символы. По умолчанию поле проверяет, что строка состоит из латинских букв, цифр, символов дефиса (-) и подчёркивания (_). Это поле часто используется в формах для создания новых записей или редактирования существующих, чтобы гарантировать корректность формируемых ссылок.

При создании экземпляра поля можно передать набор параметров, которые управляют его поведением. Основные параметры: max_length определяет максимальную длину строки, required указывает, обязательно ли поле для заполнения, label задаёт текстовую метку, а initial позволяет установить начальное значение. Дополнительно можно передать параметр allow_unicode со значением True, чтобы разрешить использование символов Unicode в слаге.

Синтаксис

pythonfrom django import forms

class MyForm(forms.Form):
  slug = forms.SlugField(
    max_length=100,
    required=True,
    label="Slug",
    initial="default-slug"
  )

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

Определим простую форму для создания статьи с полем для слага:

pythonfrom django import forms

class ArticleForm(forms.Form):
  title = forms.CharField(max_length=200, label="Заголовок")
  slug = forms.SlugField(max_length=100, label="Слаг", help_text="Только латиница, цифры, дефис и подчёркивание")
  content = forms.CharField(widget=forms.Textarea, label="Содержание")

Пример . Валидация и обработка данных

Создадим экземпляр формы с переданными данными и проверим, прошла ли она валидацию. Если данные корректны, слаг можно использовать для построения URL-адреса:

pythonfrom django import forms

class ArticleForm(forms.Form):
  title = forms.CharField(max_length=200)
  slug = forms.SlugField(max_length=100)
  content = forms.CharField(widget=forms.Textarea)

# Пример корректных данных
data = {
  "title": "Моя первая статья",
  "slug": "moya-pervaya-statya",
  "content": "Текст статьи..."
}
form = ArticleForm(data)
if form.is_valid():
  print("Форма валидна")
  print(f"Слаг: {form.cleaned_data['slug']}")
else:
  print("Ошибки валидации:", form.errors)

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

python"Форма валидна"
"Слаг: moya-pervaya-statya"

Пример . С некорректными данными

Попробуем передать строку, содержащую недопустимые символы, например, пробелы или кириллицу (при выключенном параметре allow_unicode):

pythonfrom django import forms

class ArticleForm(forms.Form):
  title = forms.CharField(max_length=200)
  slug = forms.SlugField(max_length=100)
  content = forms.CharField(widget=forms.Textarea)

# Некорректные данные: пробел и кириллица
invalid_data = {
  "title": "Моя вторая статья",
  "slug": "моя статья 2",
  "content": "Текст статьи..."
}
form = ArticleForm(invalid_data)
if form.is_valid():
  print("Форма валидна")
else:
  print("Ошибки валидации:", form.errors)
  print("Ошибка в поле slug:", form.errors.get("slug"))

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

python"Ошибки валидации: <ul class='errorlist'><li>slug<ul class='errorlist'><li>Введите корректный слаг, состоящий из букв, цифр, дефисов и подчёркиваний.</li></ul></li></ul>"
"Ошибка в поле slug: ['Введите корректный слаг, состоящий из букв, цифр, дефисов и подчёркиваний.']"

Пример . С поддержкой Unicode

Если требуется разрешить использование символов Unicode в слаге, передайте параметр allow_unicode=True:

pythonfrom django import forms

class UnicodeSlugForm(forms.Form):
  slug = forms.SlugField(allow_unicode=True, label="Unicode-слаг")

data = {"slug": "привет-мир-2024"}
form = UnicodeSlugForm(data)
if form.is_valid():
  print("Форма валидна")
  print(f"Слаг: {form.cleaned_data['slug']}")
else:
  print("Ошибки:", form.errors)

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

python"Форма валидна"
"Слаг: привет-мир-2024"

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

  • поле CharField,
    которое используется для ввода обычных строк без специальной валидации
  • поле RegexField,
    которое позволяет задать собственное регулярное выражение для валидации
  • метод validate_slug,
    который используется для ручной проверки строки на корректность слага
  • метод validate_unicode_slug,
    который проверяет слаг с поддержкой Unicode