我遗漏了一些非常基本的东西。
我正在尝试重用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
答案 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'))
答案 1 :(得分:1)
reverse
函数不只是对名称进行查找。
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
关键字参数。