Регулярное выражение в 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