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

时间:2015-06-23 20:24:16

标签: python django url routes views

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

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模板中的链接

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

当我点击链接时,它会将我重定向到博客视图,然后渲染blog.html而不是使用membres视图。

我在控制台或模板中没有出错 我的所有代码都在我的应用程序中称为“博客”

3 个答案:

答案 0 :(得分:3)

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会默认将其附加到请求中)。为了匹配一个子弹,我建议[-\w]+,它将匹配任何字母数字字符序列,_-

答案 1 :(得分:1)

这是因为urlresolver从上到下采取模式和&#39; membre&#39;匹配(?P<slug>.+),以便urlresolver返回blog视图。把更具体的urlpatterns放得更高。另外我建议在slug regexp中使用更具体的字符,即(?P<slug>[A-Za-z0-9_\-]+)

答案 2 :(得分:1)

Django停在匹配的第一个URL模式。这意味着你的 blog视图(仅查找一个或多个字符)会将您的mysite.com/membres网址解释为带有广告membres的博文。

要解决此问题,请尝试更换网址格式的顺序:

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

一般而言,出于这个原因,您希望底部最常用的模式。