Конвертер slug
Конвертер slug в Django применяется в маршрутизации URL-адресов для захвата и проверки строк, которые могут быть использованы в качестве идентификаторов ресурсов. Он соответствует строкам, состоящим из символов ASCII (буквы, цифры), дефисов и знаков подчеркивания. Конвертер slug автоматически проверяет, что переданная строка соответствует формату slug, и передает её в представление в виде аргумента. Это удобно для создания человеко-читаемых URL-адресов, например, для статей блога или категорий товаров.
Синтаксис
path('url/<slug:variable_name>/', view_function, name='some_name')
Где slug - это тип конвертера, а variable_name - имя переменной, которая будет передана в функцию представления. Маршрут будет соответствовать любому URL-адресу, где сегмент состоит только из букв, цифр, дефисов или знаков подчеркивания.
Пример
Рассмотрим пример использования конвертера slug в файле urls.py для отображения страницы статьи по её слагу:
from 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.
Теперь рассмотрим функцию представления, которая использует полученный слаг для поиска статьи в базе данных:
from 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-адресов категорий:
from 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-адреса.
Функция представления для обработки таких маршрутов может выглядеть следующим образом:
from 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})
В этом коде мы проверяем, какие аргументы были переданы, и выполняем соответствующий запрос к базе данных для получения категории.