#python #django #django-models #django-views #django-templates
Вопрос:
- Почему в некоторых случаях в urls.py используется str:slug, а в других случаях slug:slug? В чем разница? И какой вариант лучше использовать?
- И могу ли я использовать слиток категории, а затем слиток статьи в одном маршруте?
Ответ №1:
Почему в некоторых случаях в urls.py используется
str:slug
, а в других случаяхslug:slug
? В чем разница?
Конвертер путей [Django-doc] отличается. Действительно, <str:slug>
он примет другой набор строк (в данном случае строгое надмножество), чем строки <slug:slug>
, которые он примет.
В документации объясняется, что будет соответствовать:
str
— Соответствует любой непустой строке, за исключением разделителя путей, ‘/’. Это значение по умолчанию, если преобразователь не включен в выражение.slug
— Соответствует любой строке слага, состоящей из букв или цифр ASCII, а также дефиса и символов подчеркивания. Например, создание вашего 1-го сайта на django.
Таким 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
образом, будет использоваться [^/]
регулярное выражение, в то время как конвертер слизней будет соответствовать [-a-zA-Z0-9_]
регулярному выражению.
Обычно, если вы работаете со слизнями, лучше работать с преобразователем пути слизней, так как он не будет совпадать с не-слизнями, и обычно он совпадает со слизнями, а не со строками.
Был введен слизняк для работы с красивым URL-адресом. URL-адрес, в котором параметр URL содержит пробел , будет заменен уродливой процентной кодировкой, так foo bar
что, в то время как слизняк обычно использует дефис, так foo-bar
что .
И могу ли я использовать слиток категории, а затем слиток статьи в одном маршруте?
Конечно, вы можете определить путь с помощью:
path('<slug:category_slug>/<slug:article_slug>/', some_view)
some_view
Воля в этом случае принимает три параметра, так что:
def some_view(request, category_slug, article_slug):
# …
pass