我不明白我的问题是我的代码:
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视图。
我在控制台或模板中没有出错 我的所有代码都在我的应用程序中称为“博客”
答案 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'),
)
一般而言,出于这个原因,您希望底部最常用的模式。