Конвертер slug

Конвертер slug в Django применяется в маршрутизации URL-адресов для захвата и проверки строк, которые могут быть использованы в качестве идентификаторов ресурсов. Он соответствует строкам, состоящим из символов ASCII (буквы, цифры), дефисов и знаков подчеркивания. Конвертер slug автоматически проверяет, что переданная строка соответствует формату slug, и передает её в представление в виде аргумента. Это удобно для создания человеко-читаемых URL-адресов, например, для статей блога или категорий товаров.

Синтаксис

pythonpath('url/<slug:variable_name>/', view_function, name='some_name')

Где slug - это тип конвертера, а variable_name - имя переменной, которая будет передана в функцию представления. Маршрут будет соответствовать любому URL-адресу, где сегмент состоит только из букв, цифр, дефисов или знаков подчеркивания.

Пример

Рассмотрим пример использования конвертера slug в файле urls.py для отображения страницы статьи по её слагу:

pythonfrom django.urls import path
from myapp.views import article_detail

urlpatterns = [
  path('articles/<slug:article_slug>/', article_detail, name='article-detail'),
]

В этом примере любой URL-адрес, начинающийся с articles/ и содержащий строку, соответствующую формату slug, будет передан в функцию представления article_detail с аргументом article_slug.

Теперь рассмотрим функцию представления, которая использует полученный слаг для поиска статьи в базе данных:

pythonfrom django.shortcuts import render, get_object_or_404
from myapp.models import Article

def article_detail(request, article_slug):
  article = get_object_or_404(Article, slug=article_slug)
  return render(request, 'article_detail.html', {'article': article})

В этом коде мы используем полученный слаг для поиска статьи с соответствующим полем slug. Если статья не найдена, возвращается ошибка 404.

Пример

Рассмотрим использование конвертера slug в сочетании с другими конвертерами, например, для создания иерархических URL-адресов категорий:

pythonfrom django.urls import path
from myapp.views import category_detail

urlpatterns = [
  path('categories/<slug:category_slug>/', category_detail, name='category-detail'),
  path('categories/<slug:parent_slug>/<slug:child_slug>/', category_detail, name='subcategory-detail'),
]

В этом примере мы определяем два маршрута: один для категории верхнего уровня, а другой - для подкатегории. Оба используют конвертер slug для захвата соответствующих сегментов URL-адреса.

Функция представления для обработки таких маршрутов может выглядеть следующим образом:

pythonfrom django.shortcuts import render, get_object_or_404
from myapp.models import Category

def category_detail(request, parent_slug=None, child_slug=None):
  if child_slug:
    category = get_object_or_404(Category, slug=child_slug, parent__slug=parent_slug)
  elif parent_slug:
    category = get_object_or_404(Category, slug=parent_slug, parent__isnull=True)
  else:
    category = None
  return render(request, 'category_detail.html', {'category': category})

В этом коде мы проверяем, какие аргументы были переданы, и выполняем соответствующий запрос к базе данных для получения категории.

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

  • функция path,
    которая определяет маршрут с использованием конвертеров
  • конвертер str,
    который соответствует любой непустой строке без разделителей
  • конвертер int,
    который соответствует целым числам
  • конвертер uuid,
    который соответствует универсальным уникальным идентификаторам