在Django中处理多个视图/多个URL

时间:2014-10-12 17:01:56

标签: python django

我在尝试处理与主页无关的视图时遇到404错误。例如,如果我最初从主页 home 开始,并且想要导航到另一个名为 otherpage 的页面,则会收到404找不到的otherpage.html。

我做的方式是基于直觉。因此,如果有更好的方法,请提及:

在文件中:

prd/
   views.py
   url.py
   otherstuffthatshouldbehere.py..

我有 views.py (这是我认为错误的地方):

from django.shortcuts import render

def home(request):
    context = {}
    template = "index.html"
    return render(request, template, context)

def otherpage(request):
    context = {}
    template = "otherpage.html"
    return render(request, template, context)

然后是urls.py:

from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns('',
    url(r'^$', 'prd.views.home', name='home'),
    url(r'^$', 'prd.views.otherpage', name='otherpage'),

    url(r'^admin/', include(admin.site.urls)),
)

这将返回otherpage.html的404。我有模板目录正常工作。但是我如何处理多个视图?

编辑:

添加:

url(r'^otherpage$', 'prd.views.otherpage', name='otherpage'), 

我收到了这个错误:

Using the URLconf defined in prd.urls, Django tried these URL patterns, in this order:
^$ [name='home']
^about$ [name='about']
^projects$ [name='projects']
^admin/
The current URL, about.html, didn't match any of these.

1 个答案:

答案 0 :(得分:1)

urlpatterns从顶部开始然后向下,直到它与基于正则表达式的URL匹配。为了让Django提供位于otherpage.html的页面,必须在urlpatterns中定义一个与otherpage.html匹配的URL,否则你将得到404.

在这种情况下,你有:

url(r'^$', 'prd.views.home', name='home'),
url(r'^$', 'prd.views.otherpage', name='otherpage'),

请注意,此处otherpage没有任何内容可以访问home因为url(r'^$', 'prd.views.home', name='home'), url(r'^otherpage.html$', 'prd.views.otherpage', name='otherpage'), 具有相同的模式(正则表达式),因此将始终匹配。您希望为这两者设置不同的URL,以便区分它们。也许你可以这样做:

url(r'^otherpage.html$', 'prd.views.otherpage', name='otherpage'),

进行此更改后,您现在可以与其他页面匹配,并且希望不再有404。

编辑:

www.example.com/otherpage.html

匹配www.example.com/otherpage,但不匹配www.example.com/otherpage

要匹配url(r'^otherpage$', 'prd.views.otherpage', name='otherpage'), ,您需要使用:

.html

注意正则表达式的区别,这里没有{{1}}。正则表达式与您放入的正确匹配。