2

redirect私は、どのように、またはむしろreverse実際に機能するかを理解する上でいくつかの問題を抱えています。

メインのurls.pyには次のものがあります。

from django.conf.urls import patterns, include, url
from django.views.generic.simple import redirect_to

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

そしてmonitors.urls私は持っています:

from django.conf.urls import patterns, include, url 

urlpatterns = patterns('monitor.views',
        (r'^$', 'index'),
        (r'^abc/(?P<id>.*$)', 'abc'),
)   

あなたが電話するとき、私は/monitorそれをリダイレクトしたい/monitor/abcので、私はしました:

def index(request):
    return redirect("abc")

def abc(render, id=None):
    return render_to_response("monitor/list.htmld", {})

しかし、私はNoReverseMatch例外を得ました。しかし、私がそうするとき:

def index(request):
    return redirect("abc/")

その後、突然動作します。

理由がよくわかりません。なぜ失敗したがreverse失敗しabcなかったのabc/ですか?reverseまた、リダイレクトに含める必要があることをどのようにして知ることがmonitor/できますか?メインのurls.pyに、ビューxyzを持つ別のアプリがあった場合はどうなりますか?abc

4

1 に答える 1

3

'abc'ではリバースが失敗したのに'abc/'では失敗したのはなぜですか?

それはビュー名として解釈されたので(そしてあなたは確かにという名前のビューを持っているので、あなたのファイル'abc'を見てください)。monitor.urlsこれは、DjangoがreverseURLを計算するために呼び出すことを意味します。値abc/は実際のURLとして解釈されます。つまり、DjangoはreverseURLを決定するために呼び出しません。

reverseこれは、失敗した理由も説明しています。名前の付いたビューには、。abcという引数も必要idです。abcそうしないと、パラメーターなしで呼び出されたビューがないため、DjangoはURLを検索できません。

ドキュメントに基づいて、次を使用してURLを逆にすることができるはずです。

redirect("abc", id=...)

ここ...で、はidパラメータの値です。

また、reverseは、リダイレクトにmonitor /も含める必要があることをどのように認識しますか?

これは、使用可能なURLを認識しており、1)呼び出されたビューabcが定義されている場所を認識しており、2)フロントmonitors.urlsに含まれていることを認識しているためです。monitor/

メインのurls.pyに、「abc」ビューもある「xyz」という別のアプリがある場合はどうなりますか?

その場合、名前空間を使用する必要があります。

于 2012-08-13T16:38:08.237 に答える