Разница между <str:slug> и <slug:slug> в urls.py приложения Django
- Why in some cases in urls.py is used str:slug, and in other cases slug:slug? What is the difference? And which option is better to use?
- And can I use a category slug and then an article slug in one route?
Почему в одних случаях в urls.py используется
str:slug
, а в другихslug:slug
? В чем разница?
Конвертер path converter [Django-doc] отличается. Действительно, <str:slug>
будет принимать другой набор строк (в данном случае строгое супермножество), чем те строки, которые принимает <slug:slug>
.
В документации объясняется, что будет сопоставлено:
str
- Сопоставляет любую непустую строку, исключая разделитель путей '/'. Это значение используется по умолчанию, если преобразователь не включен в выражение.
slug
- Ищет любую строку slug, состоящую из букв или цифр ASCII, плюс символы дефиса и подчеркивания. Например, building-your-1st-django-site.
Таким образом, str
будет соответствовать любой непустой строке, он будет принимать 'foo'
, 'straße'
, 'foo bar'
, в то время как slug
преобразование пути будет существовать только как непустая последовательность ASCII букв и цифр, дефисов и подчеркиваний.
Мы также можем видеть это в реализации StringConverter
[GitHub] и реализации SlugConverter
[GitHub]:
class StringConverter: regex = '[^/]+' def to_python(self, value): return value def to_url(self, value): return value # ⋮ class SlugConverter(StringConverter): regex = '[-a-zA-Z0-9_]+'
Таким образом, StringConverter
будет использовать [^/]+
regex, в то время как конвертер slug будет соответствовать [-a-zA-Z0-9_]+
regex.
Обычно, если вы работаете со слизнями, лучше работать с конвертером путей слизней, так как он не сопоставляется с неслизнями, и обычно сопоставляется со слизнями, а не со строками.
Для работы с красиво выглядящим URL был введен slug. URL, где параметр URL содержит пробел, будет заменен на ugly процентной кодировкой, так foo%20bar
, тогда как в слоге обычно используется дефис, так foo-bar
.
А могу ли я использовать в одном маршруте название категории, а затем название статьи?
Конечно, вы можете определить путь с:
path('<slug:category_slug>/<slug:article_slug>/', some_view)
В этом случае some_view
будет принимать три параметра, так:
def some_view(request, category_slug, article_slug):
# …
pass