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]+
,它将匹配任何字母数字字符序列,_
和 -
.
我不明白我的问题,这是我的代码:
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]+
,它将匹配任何字母数字字符序列,_
和 -
.