Разница между и в urls.py из приложения Django

#python #django #django-models #django-views #django-templates

Вопрос:

  1. Почему в некоторых случаях в urls.py используется str:slug, а в других случаях slug:slug? В чем разница? И какой вариант лучше использовать?
  2. И могу ли я использовать слиток категории, а затем слиток статьи в одном маршруте?

Ответ №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