Django slug的URL中的正则表达式

时间:2014-04-29 07:48:54

标签: regex django

我有2个网址,网址中有一个slug字段。

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

以下是我在HTML

中访问第二个网址的方法
<li><a href="{% url 'genre_month' slug=genre.slug %}">Monthly Top Songs</a></li>

我试图在视图中打印slug。它以genre_name/monthly而不是genre_name传递。

我认为问题在于URL中的正则表达式。知道这里有什么问题吗?

3 个答案:

答案 0 :(得分:19)

Django总是使用匹配的第一个模式。对于类似于genres/genre_name/monthly的网址,您的第一个模式匹配,因此第二个模式永远不会被使用。事实是正则表达式不够具体,允许所有字符 - 这似乎没有意义。

您可以颠倒这些模式的顺序,但您应该做的是使它们更具体(比较:urls.py example in generic class-based 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'),

答案 1 :(得分:10)

我相信您也可以从@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代表&#34; 字符&#34;。它始终与ASCII字符[A-Za-z0-9_]匹配。请注意包含下划线和数字。 more info

答案 2 :(得分:2)

在Django&gt; = 2.0中,slug包含在URL中,如下所示。

dataframe$var2

来源:https://docs.djangoproject.com/en/2.0/ref/urls/#django.urls.path