1

でdjango.shortcuts.redirectを理解するreverseとについてのスレッドを開始しましたredirect_to

reverse最初のパラメーターが文字列の場合、どのように機能するかを理解するのにまだ問題があります。https://docs.djangoproject.com/en/1.4/topics/http/shortcuts/#django.shortcuts.redirectを何度も読み、対応する部分をreverse. しかし、私はまだNoReverseMatch例外を受けています。

私のROOT_URLCONF中で私は持っています

urlpatterns = patterns('',
    url(r'^$', redirect_to, {'url': '/monitor/'}),
    url(r'^monitor/', include('monitor.urls')),
)

monitor.urlsが持っている

urlpatterns = patterns('monitor.views',
    (r'^$', 'index'),
    (r'^list', 'listall'),
)

で、monitor.urls両方の関数のコードを定義indexしましlistallた。次listallの行を追加しました。

def listall(request):
    <more code goes here>
    print "reversing 1 index: %s " % reverse(index)
    print "reversing 2 index: %s " % reverse('index')
    render_to_response("monitor/list.htmld", params)

localhost:3000/monitor/list にアクセスすると、

reversing 1 index: /monitor/ 

2番目reverseは例外を発生させます。なんで?私は何が欠けていますか?

私はそれをdjangosコードdjango.core.urlresolvers.callabledjango.core.urlresolvers.get_mod_func. get_mod_func「ab」のようなものを期待しているようです。callableそのため、最初の行で「index」が返されましfunc_nameたが、の場合は空の文字列が返されましmod_nameた。2行目を次のように変更しました

    print "reversing 2 index: %s " % reverse('monitor.views.index')

そしてそれは意図したとおりに機能しました。reverseでは、完全なモジュール名と関数名 (文字列を使用する場合) を使用して呼び出す必要があるのに、ドキュメントではそうではないのはなぜですか? 私は何が欠けていますか?

ありがとう

4

2 に答える 2

2

あなたがハングアップしているドキュメントの部分はわかりませんが、reverseの最初のパラメーターは、ビューに到達するための識別方法です。それは、urlpattern 名、ビューへの完全なドット パス、または自分自身を見る

したがって、あなたの例に基づいて、urlpattern の名前を定義していないため、最初のメソッドは使用できません。あなたの最初の試みは、reverse(index)文字通りビューを渡したのでうまくいきました。reverse('index')完全なインポート コンテキスト、つまり が必要なため、2 回目の試行は機能しません'monitor.views.index'。2 つの違いは、文字列の場合、Django はその文字列を解釈してビューのインポートを作成する必要があり、'index' はインポート パスを決定するのに十分な情報ではないことです。

ただし、ビューを元に戻す場合は、ビューに名前を付けるだけの方がはるかに優れています。また、2 つの異なるアプリが競合しないように、含まれている urlpattern の名前空間も指定する必要があります。したがって、プロジェクト レベルの urls.py では:

urlpatterns = patterns('',
    url(r'^$', redirect_to, {'url': '/monitor/'}),
    url(r'^monitor/', include('monitor.urls', namespace='monitor', app_name='monitor')),
)

次に、monitor/urls.py で:

urlpatterns = patterns('monitor.views',
    (r'^$', 'index', name='index'),
    (r'^list', 'listall', name='listall'),
)

その後、リバースは と同じくらい簡単reverse('monitor:index')です。

于 2012-08-16T17:45:01.113 に答える
2

あなたは次のようなことをしているはずです

reverse('monitor:index')

ROOT_URLCONFが持っている

urlpatterns = patterns('',
   (r'^$', redirect_to, {'url': '/monitor/'}),
   (r'^monitor/', include('monitor.urls'),namespace='monitor'),
)

とでmonitor.url.py

urlpatterns = patterns('monitor.views',
   url(r'^$', 'index',name='index'),
)

詳細については、https://docs.djangoproject.com/en/1.4/topics/http/urls/#django.core.urlresolvers.reverseをご覧ください。

于 2012-08-16T11:26:10.777 に答える