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

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

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 オーバーロードへの供物
4

1 に答える 1

2

逆の場合、Django は次の方法で一致を試みます。

  • URLラベル
  • 点線のパス
  • 呼び出し可能

あなたのコードで'my_project.my_app.views.index'は、パスがドットで囲まれている場合、Django は実際の関数index()を取得し、それをキーとして使用して、マッピング ディクショナリを検索して、逆 URL に一致させますdjango.core.urlresolvers.get_resolver(None).reverse_dict

ただし、view.indexbyをラップするcache_viewと、マッピング辞書のキーがラッパーになります。したがって、ルックアップは失敗し、NoReverseMatch発生します。これは不便でエラーが発生しやすいですが、バグかどうかはわかりません。

URL次に、ラベルを使用してこれを解決できます

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

またはあなたが述べたようにデコレータとして使用cache_pageされます。views.py

于 2012-06-14T06:04:09.433 に答える