В 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'),