Поле SlugField

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

Параметры поля

Основные параметры SlugField:

Важно отметить, что SlugField по умолчанию имеет параметр db_index=True, что делает его эффективным для поиска по слагам. Также это поле часто используется вместе с параметром unique=True для обеспечения уникальности URL-адресов.

Синтаксис

pythonfrom django.db import models

class Article(models.Model):
  title = models.CharField(max_length=100)
  slug = models.SlugField(max_length=50, unique=True)

Пример

Давайте создадим модель статьи с полем SlugField и добавим несколько записей:

pythonfrom django.db import models

class Article(models.Model):
  title = models.CharField(max_length=100)
  slug = models.SlugField(max_length=50, unique=True, blank=True)
  
  def __str__(self):
    return self.title
pythonfrom myapp.models import Article

# Создание статьи с слагом
article1 = Article.objects.create(
  title="My First Article",
  slug="my-first-article"
)

# Создание статьи без указания слага (будет пусто)
article2 = Article.objects.create(
  title="Hello World"
)

print(article1.slug)
print(article2.slug)

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

python"my-first-article"
""

Пример

Давайте используем параметр allow_unicode=True для поддержки кириллицы в слагах:

pythonfrom django.db import models

class Category(models.Model):
  name = models.CharField(max_length=100)
  slug = models.SlugField(max_length=50, unique=True, allow_unicode=True)
pythonfrom myapp.models import Category

# Создание категории с кириллическим слагом
category = Category.objects.create(
  name="Новости",
  slug="новости"
)

# Поиск по слагу
found = Category.objects.get(slug="новости")
print(found.name)

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

python"Новости"

Пример

Давайте используем SlugField для создания ЧПУ-адресов в URL конфигурации:

python# urls.py
from django.urls import path
from myapp import views

urlpatterns = [
  path('article/<slug:slug>/', views.article_detail, name='article_detail'),
]
python# views.py
from django.shortcuts import get_object_or_404
from myapp.models import Article

def article_detail(request, slug):
  article = get_object_or_404(Article, slug=slug)
  return render(request, 'article_detail.html', {'article': article})
pythonfrom myapp.models import Article

# Получение статьи по слагу через URL
# В браузере: /article/my-first-article/

# Программное получение статьи
article = Article.objects.get(slug="my-first-article")
print(article.title)

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

python"My First Article"

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

  • поле CharField,
    которое используется для хранения строк небольшой длины
  • поле TextField,
    которое предназначено для хранения больших текстов
  • поле URLField,
    которое используется для хранения URL-адресов
  • метод get_absolute_url,
    который возвращает URL для объекта модели