Understanding django.shortcuts.redirect

泄露秘密 提交于 2019-12-01 09:54:20

问题


I have a couple problems understanding how redirect or rather reverse really work.

In the main urls.py I have:

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

and in monitors.urls I have:

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

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

When you call /monitor I want to redirect it to /monitor/abc so I did:

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

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

But I got an NoReverseMatch exception. But when I do:

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

then it suddenly works.

I cannot fully understand why. Why did reverse fail with abc but not with abc/? And how does reverse know that the redirect should include monitor/ as well? What if I had in the main urls.py another app called xyz which also has a abc view?


回答1:


Why did reverse fail with 'abc' but not with 'abc/'?

Because it interpreted it as a view name (and you indeed have a view named 'abc', see your monitor.urls file). This means Django will call reverse to compute the URL. The value abc/ is interpreted as an actual URL which means Django won't call reverse to determine the URL.

This also explains why reverse failed: the view with name abc also requires an argument called id. Otherwise Django won't be able to lookup the URL as there is no view called abc without parameters.

Based on the documentation you should be able to reverse the URL using:

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

where ... is the value of the id parameter.

And how does reverse know that the redirect should include monitor/ as well?

That is because it knows what URLs are available and 1) it knows where the view called abc is defined and 2) it knows that monitors.urls is included with monitor/ in front.

What if I had in the main urls.py another app called "xyz" which also has a "abc" view?

In that case you have to use namespaces.



来源:https://stackoverflow.com/questions/11938458/understanding-django-shortcuts-redirect

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!