在urls.py中使用cache_page的Django NoReverseMatch异常

时间:2012-06-14 02:00:39

标签: python django

问题

为什么在模板中使用cache_page标记时,在Django 1.4下的urls.py中使用url函数会导致NoReverseMatch错误?

设置

views.py

from django.shortcuts import render

def index(request):
    '''Display the home page'''
    return render(request, 'index.html')

urls.py

关注cache_page directions

from django.conf.urls import patterns, include, url
from django.views.decorators.cache import cache_page
from my_project.my_app import views

urlpatterns = patterns('',
    url(r'^$', cache_page(60 * 60)(views.index)),
)

的index.html

{% url my_project.my_app.views.index %}

错误消息

NoReverseMatch at /
Reverse for 'my_project.my_app.views.index' with arguments '()' and keyword arguments '{}' not found.

错误消息指出的违规行当然是:

{% url my_project.my_app.views.index %}

到目前为止我尝试了什么

  • 大量的谷歌搜索和搜索SO
  • 将代码简化为上述示例以排除其他冲突
  • cache_page中使用views.py成功装饰(根据文档不推荐)
  • 为我们全能的Django霸主提供服务

1 个答案:

答案 0 :(得分:2)

当做反向时,Django试图通过

进行匹配
  • URL标签
  • 虚线路径
  • 可调用

在你的代码中,'my_project.my_app.views.index'是虚线路径,然后Django会得到实际的函数index(),并通过查找映射字典{{1}将其用作匹配反转URL的键。 }}。

但是,当您将django.core.urlresolvers.get_resolver(None).reverse_dict换行view.index时,映射字典中的键将成为包装器。因此查找失败并引发cache_view。这很不方便且容易出错,但我不确定它是否是一个错误。

然后您可以使用NoReverseMatch标签

解决此问题
URL

或在url(r'^$', cache_page(60 * 60)(views.index), name='my_index'), {# in template #} {% url my_index %} 中使用cache_page作为您提到的装饰器。