Django反向问题()

时间:2011-03-27 08:46:02

标签: django reverse

我遗漏了一些非常基本的东西。

我正在尝试重用django的更改密码视图。我在urls.py中有以下内容:

(r'^change-password/$', 'profile.views.change_password', {},'change_password'),
url(r'^change-password-done/$', 'profile.views.password_change_done', name='django.contrib.auth.views.password_change_done'),

并在相应的views.py中:

from django.contrib.auth.views import password_change, password_change_done

def change_password(request,template_name="password_change_form.html"):
    """Change Password"""
    return password_change(request,template_name=template_name)

def password_change_done(request, template_name="password_change_done.html"):
    return render_to_response(template_name,(),context_instance= RequestContext(request))

但我收到以下错误:

  

反向   'django.contrib.auth.views.password_change_done'   带参数'()'和关键字   没有找到参数“{}”。

查看了源代码并看到了这一行:

post_change_redirect = reverse('django.contrib.auth.views.password_change_done')

如果我将urls.py条目更改为以下内容,则不会出现上述错误:

url(r'^change-password-done/$', 'django.contrib.auth.views.password_change_done', name='anything'),

但我很困惑,因为reverse()应该使用“name”参数查找?我在这里缺少什么?

我正在使用django 1.2.3

2 个答案:

答案 0 :(得分:2)

Josh有解释,但你做错了。如果要覆盖post_save_redirect,请在调用视图时将其作为参数传递:

def change_password(request,template_name="password_change_form.html"):
    return password_change(request, template_name=template_name, 
                           post_save_redirect=reverse('my_done_page'))

请参阅the documentation

答案 1 :(得分:1)

reverse函数不只是对名称进行查找。

Reverse Documentation

  

reverse(viewname,urlconf = None,args = None,kwargs = None,current_app = None)     viewname是函数名称(函数引用或名称的字符串版本,如果您在urlpatterns中使用该表单)或URL模式名称。

因此,通过执行reverse('django.contrib.auth.views.password_change_done'),它将在urls.py正则表达式中查找该视图名称,并在视图名称无法解析时回退到查找name关键字参数。