Регулярное выражение в URL-адресе для Django slug
У меня есть 2 URL-адреса с полем slug в URL-адресе.
url(r'^genres/(?P<slug>.+)/$', views.genre_view, name='genre_view'),
url(r'^genres/(?P<slug>.+)/monthly/$', views.genre_month, name='genre_month'),
Первый открывается отлично, а второй дает ошибку DoesNotExist
, говорящую Genres matching query does not exist
.
Вот как я просматриваю второй URL в своем HTML
<li><a href="{% url 'genre_month' slug=genre.slug %}">Monthly Top Songs</a></li>
Я попытался напечатать слизню в представлении. Вместо genre_name
он передается как genre_name/monthly
.
Я думаю, проблема связана с регулярным выражением в URL-адресах. Любая идея, что здесь не так?
Ответы
Ответ 1
Django всегда использует первый шаблон, который соответствует. Для URL-адресов, похожих на genres/genre_name/monthly
, ваш первый шаблон совпадает, поэтому второй никогда не используется. Истина заключается в том, что регулярное выражение недостаточно специфично, позволяя всем персонажам, что, по-видимому, не имеет смысла.
Вы можете изменить порядок этих шаблонов, но что вы должны сделать, это сделать их более конкретными (сравните: пример urls.py в родовом классе views docs):
url(r'^genres/(?P<slug>[-\w]+)/$', views.genre_view, name='genre_view'),
url(r'^genres/(?P<slug>[-\w]+)/monthly/$', views.genre_month, name='genre_month'),
Ответ 2
Я считаю, что вы также можете отбросить _
из шаблона, который @Ludwik предложил и пересматривает эту версию (это один символ проще:))
url(r'^genres/(?P<slug>[-\w]+)/$', views.genre_view, name='genre_view'),
url(r'^genres/(?P<slug>[-\w]+)/monthly/$', views.genre_month, name='genre_month'),
Обратите внимание, что \w
обозначает символ слова. Он всегда соответствует символам ASCII [A-Za-z0-9_]
. Обратите внимание на включение подчеркивания и цифр. подробнее
Ответ 3
В Django >= 2.0 slug включен в URL, делая это, как показано ниже.
from django.urls import path
urlpatterns = [
...
path('articles/<slug:some_title>/', myapp.views.blog_detail, name='blog_detail'),
...
]
Источник: https://docs.djangoproject.com/en/2.0/ref/urls/#django.urls.path