Django 网址将我重定向到其他视图

django urls redirect me to other view

我不明白我的问题,这是我的代码:

urls.py

urlpatterns = patterns('blog.views',
    ...
    url(r'^(?P<slug>.+)$', 'blog', name='blog'),
    url(r'^membres$', 'membres', name='membres'),
)

观看次数:

def blog(request, slug):
posts = Post.objects.filter(blog__slug=slug)
return render(request, 'blog/blog.html', locals())

def membres(request):
membres = User.objects.all()
return render(request, 'blog/membres.html', {'membres': membres})

这是我的 base.html 模板中的 link

<li><a href="{% url "membres" %}">List</a></li>

当我单击 link 时,它会将我重定向到博客视图,然后呈现 blog.html 而不是使用 membres 视图。

我在控制台或我的模板中没有发现任何错误。
我所有的代码都在我的应用程序中,名为 'blog'

这是因为 urlresolver 从上到下采用模式并且 'membres' 匹配 (?P<slug>.+) 所以 urlresolver returns blog 查看。将更具体的 urlpatterns 放在更高的位置。我还建议在 slug regexp 中使用更具体的字符,即 (?P<slug>[A-Za-z0-9_\-]+).

Django 在匹配的第一个 URL 模式处停止。这意味着您的 blog 视图 -- 仅查找一个或多个字符 -- 会将您的 mysite.com/membres URL 解释为带有 membres 别名的博客 post。

要修复它,请尝试调换 URL 模式的顺序:

urlpatterns = patterns('blog.views',
    ...
    url(r'^membres$', 'membres', name='membres'),
    url(r'^(?P<slug>.+)$', 'blog', name='blog'),
)

一般来说,正是出于这个原因,您希望最通用的模式位于底部。

Django 使用第一个匹配的模式。您的第一个 URL 正则表达式匹配任何字符串,包括 /membres,因此 Django 永远不会尝试第二个。我建议这样:

urlpatterns = patterns('blog.views',
    url(r'^/blog/(?P<slug>[-\w]+)/$', 'blog', name='blog'),
    url(r'^membres/$', 'membres', name='membres'),
)

如果你一定要有一个包罗万象的模式,它应该是列表中的最后一个,所以其他模式有机会匹配之前:

urlpatterns = patterns('blog.views',
    url(r'^membres/$', 'membres', name='membres'),
    # other patterns...
    url(r'^(?P<slug>[-\w]+)/$', 'blog', name='blog'),
)

始终包含尾部斜杠也是一个好习惯(Django 默认将其附加到请求中)。要匹配 slug,我建议 [-\w]+,它将匹配任何字母数字字符序列,_-.