在django中使用虚拟URL模式的名称

时间:2015-01-06 10:57:54

标签: django django-urls

我有一个名为考试的应用项目。现在我的索引页面是其中一个应用程序的索引页面。所以url模式是这样的:

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

urlpatterns = patterns('',
    url(r'^', include('exams.urls', namespace="exams")),
)

但是,将来我可能会为索引页面创建一个新视图,并将网址格式更改为以下内容:

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

urlpatterns = patterns('',
    url(r'^exams/', include('exams.urls', namespace="exams")),
    url(r'^/$', 'mysite.views.index', name="index"),
)

我想在我的模板中创建一些链接来索引它是否加载了考试应用程序或其他视图。所以我尝试使用url方法的name参数(如上所述),但似乎它不起作用。当我在模板中使用{% url 'index' %}时,它会返回以下错误:

Reverse for 'index' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []

UPD:我忘了提到我尝试使用以下代码:

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

urlpatterns = patterns('',
    url(r'^', include('exams.urls', namespace="exams"), name="index"),
)

我收到了上面写的错误。

UPD2 :更多地澄清问题: 现在,当我转到http://mydomain/时,我会看到我的应用索引。但也许将来我喜欢更改我的索引页面并使用另一个视图来创建它。因此,当我转到http://mydomain/时,我会看到该视图呈现的页面,并转到http://mydomain/exams我会看到我的应用索引页面。在那种情况下,我的urls.py将像我上面写的第二个代码一样,我可以使用{% url 'index' %}标签轻松链接到索引页面。但是现在我正在使用我在第一次更新中编写的代码。我希望我的模板将{% url 'index' %}呈现为我的索引页面的链接(而不是使用{% url 'exams:index' %},所以当我稍后更改urls.py代码时,我不必更改所有模板。< / p>

2 个答案:

答案 0 :(得分:0)

如果我理解正确,那么你现在没有名称为index的url,在他的情况下,当模板呈现时,它会尝试查找名为index的url,而不是找到它,它失败了。您可能需要的是创建网址并立即重定向到另一个视图,如下所述:

Redirect to named url pattern directly from urls.py in django?

更新:

我仍然不完全确定你想要什么(抱歉),但我怀疑你想要做的是类似的事情:

from django.conf.urls import patterns, include, url
from django.core.urlresolvers import reverse_lazy
from django.views.generic import RedirectView

urlpatterns = patterns('',
    url(r'^exams/', include('exams.urls', namespace="exams")),
    url(r'^/$', RedirectView.as_view(url=reverse_lazy('exams:index'), name="index"),
)

Raphael给你的解决方案是类似的,但用户不会被重定向(用户将看到相同内容的两个网址)。也许这就是你要找的东西?

答案 1 :(得分:0)

如果我理解得很好,您需要一个可以轻松更改的索引视图,同时不更改模板中指向它的链接。您可以将索引视图用作其他视图的包装,即:

def a_view_that_will_show_all_the_exams(request):
    # this is the page displayed for now as default, but this could change
    # some logic here

def another_view_that_could_become_the_home_page(request):
    # some logic here

def index(request):
    return a_view_that_will_show_all_the_exams(request)
    # or another_view_that_could_become_the_home_page
    # or return exams.views.whatever_view

通过这种方式,您可以轻松更改索引视图的结果,同时保持链接静态。