0

问题

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

设置

视图.py

from django.shortcuts import render

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

网址.py

按照cache_page 指示

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)),
)

索引.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_pageviews.py(根据文档不推荐)
  • 献给我们全能的 Django 霸主
4

1 回答 1

2

进行反向时,Django 尝试匹配

  • URL标签
  • 虚线路径
  • 可调用的

在您的代码中,是虚线路径,然后 Django 将通过在映射字典中查找来'my_project.my_app.views.index'获取实际函数并将其用作匹配反向 URL 的键。 index()django.core.urlresolvers.get_resolver(None).reverse_dict

但是,当您包装view.indexbycache_view时,映射字典中的键将成为包装器。因此查找失败并被NoReverseMatch引发。这很不方便且容易出错,但我不确定这是否是一个错误。

然后你可以通过使用URL标签来解决这个问题

url(r'^$', cache_page(60 * 60)(views.index), name='my_index'),
{# in template #}
{% url my_index %}

或用作您提到的装饰器cache_pageviews.py

于 2012-06-14T06:04:09.433 回答