В Django, используя urlpatterns, как сопоставить символ слеша, закодированный в url, как часть параметра?

В приложении Django - этом - у меня есть список urlpatterns, который выглядит следующим образом:

urlpatterns = [
    url(r'^$', schema_view, name='swagger'),
    url(r'^(?P<page_title>.+)/(?P<rev_id>[0-9]+)/$',
        WhoColorApiView.as_view(), name='wc_page_title_rev_id'),
    url(r'^(?P<page_title>.+)/$',
        WhoColorApiView.as_view(), name='wc_page_title'),
]

Вторая запись будет соответствовать пути типа /en/whocolor/v1.0.0-beta/September_11_attacks/1108730659/?origin=*, а третья - пути типа /en/whocolor/v1.0.0-beta/September_11_attacks/?origin=*.

Идея заключается в том, что он сопоставляет параметр page_title (название статьи Википедии) и необязательный целочисленный параметр rev_id (id ревизии).

Однако он не работает, как предполагалось, для статьи под названием "Post-9/11", с путем /en/whocolor/v1.0.0-beta/Post-9%2f11/?origin=*. Я хочу, чтобы это не соответствовало второму шаблону (который получает соответствие в виде page_title "Post-9" и rev_id 11), а вместо этого соответствовало третьему шаблону.

Я понимаю, почему второй шаблон должен соответствовать, если путь /en/whocolor/v1.0.0-beta/Post-9/11/?origin=*, но когда заголовок имеет url-код "Post-9%2f11", он все равно соответствует второму шаблону вместо того, чтобы перейти к третьему шаблону.

Как заставить Django воспринимать url-кодированный слэш как часть параметра, а не как разделитель путей?

В Django есть нечто под названием Path Converters.

Один из существующих конвертеров путей имеет дело с вещами со слешами

path - Сопоставляет любую непустую строку, включая разделитель пути '/'. Это позволяет выполнять поиск по полному пути URL, а не по сегменту пути URL, как в случае с str.

.
path('<path:page_title>/',
         views.post_detail,
         name='post_detail'),

Как отметил в комментарии Иван Старостин , ОП должен использовать конвертер путей slug.

Согласно документации

Слизняк - это краткое обозначение чего-либо, содержащее только буквы, цифры, подчеркивание или дефис.

Например, building-your-1st-django-site.

Для этого желательно, чтобы ОП использовал в модели поле типа SlugField.

slug = models.SlugField(max_length=250)

Тогда в urls.py

path('<slug:post>/',
         views.post_detail,
         name='post_detail'),
Вернуться на верх