【问题标题】:Using a name for dummy url patterns in django在 django 中为虚拟 url 模式使用名称
【发布时间】:2015-03-04 00:48:12
【问题描述】:

我有一个项目,其中包含一个名为考试的应用。现在我的索引页面是这些应用程序之一的索引页面。所以 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'^/$', '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 代码时,我不必更改所有模板。

【问题讨论】:

  • 看看这个问题,它可能会有所帮助。 stackoverflow.com/questions/22473390/…
  • 您的 mysite.views.index 视图是否需要第二个参数,即 def index(request, other_arg): ... ?
  • @Raphael:实际上我现在没有 mysite.views.index,但我打算创建一个。但在我这样做之前,我希望我的索引成为我的应用索引页面。

标签: django django-urls


【解决方案1】:

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

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

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

【讨论】:

  • 您好,非常感谢。
【解决方案2】:

如果我理解正确的话,现在你没有一个名为 index 的 url,在他的情况下,当模板呈现时,它会尝试找到一个名为 index 的 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 为您提供的解决方案类似,但不会重定向用户(使用两个 url,用户将看到相同的内容)。也许这就是你要找的?

【讨论】:

  • 您好,感谢您的回答。我更新了我的帖子。我之前用 name="index" 测试了 urls.py,但它也没有工作。但是您提供的链接就像一个魅力。非常感谢。
  • 你好。对不起,这是我的错。我以为它正在工作。实际上,使用您给我的链接,如果我为我的应用程序索引使用另一个地址,我可以实现索引。因此我将无法使用mydomain 作为我的索引页。我将重新更新我的帖子以添加示例以澄清问题。谢谢你的回答
  • 嗨。是的,我在找某事。就像拉斐尔推荐的一样。但是,您的回答也很有帮助。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-03
  • 2023-03-20
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
  • 1970-01-01
相关资源
最近更新 更多