在 Django 中使用虚拟 url 模式的名称

Using a name for dummy url patterns in django

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

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

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

不过,将来我可能想为我的索引页创建一个新视图并将 url 模式更改为如下内容:

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

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

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

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

更新: 我忘了说我试过使用以下代码:

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 将像我上面写的第二个代码一样,在其中我可以轻松地 link 使用 {% url 'index' %} 标记来索引页面。但是现在我正在使用我在第一次更新中编写的代码。我希望我的模板将 {% url 'index' %} 作为 link 呈现到我的索引页面(而不是使用 {% url 'exams:index' %} 所以当我以后更改 urls.py 代码时我不必更改我所有的模板。

, 'mysite.views.index', name="index"), )

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

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

更新: 我忘了说我试过使用以下代码:

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 将像我上面写的第二个代码一样,在其中我可以轻松地 link 使用 {% url 'index' %} 标记来索引页面。但是现在我正在使用我在第一次更新中编写的代码。我希望我的模板将 {% url 'index' %} 作为 link 呈现到我的索引页面(而不是使用 {% url 'exams:index' %} 所以当我以后更改 urls.py 代码时我不必更改我所有的模板。

如果我没理解错的话,现在你没有 url 名称索引,在他的情况下,当模板呈现时,它会尝试找到 url 命名索引,当找不到它时,它会失败。您可能需要创建 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 给你的解决方案是相似的,但用户不会被重定向(两个 urls 用户将看到相同的内容)。也许这就是您要找的东西?

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

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

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