Nrz*_*ine 0 forms django inheritance class-based-views
美好的一天!
我正在学习基于类视图的Django(1.8).Django本身提供了一个验证模块,可以更改用户的密码.在使用Django的 PasswordChangeForm(扩展Django的 SetPasswordForm)时,我偶然发现了以下错误:
init()缺少1个必需的位置参数:'user'
当我看一下SetPasswordForm类时,我可以看到它需要一个user-object作为参数.
def __init__(self, user, *args, **kwargs):
self.user = user
super(SetPasswordForm, self).__init__(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
我最初做了什么?
首先,在我看来,我只是分配了Django的PasswordChangeForm:
class ChangePassword(LoginRequiredMixin, FormView):
template_name = 'users/reset_password.html'
form_class = PasswordChangeForm
Run Code Online (Sandbox Code Playgroud)
这当然导致了错误,因为没有提供用户对象.
那么我试图解决这个问题呢?
尝试一个:自定义表单,它继承自PasswordChangeForm并添加init方法.
由于PasswordChangeForm没有init方法,我创建了一个名为MyPasswordChangeForm的新表单类,它继承自PasswordChangeForm并添加了init:
class MyPasswordChangeForm(PasswordChangeForm):
def __init__(self, request, *args, **kwargs):
super(MyPasswordChangeForm, self).__init__(request.user, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
预期结果:MyPasswordChangeForm->继承自PasswordChangeForm并在SetPasswordForm中添加init-> super init-> perform init
实际结果:super正在调用LoginRequiredMixin:
init()缺少1个必需的位置参数:'
request'stack-tr l:80返回super(LoginRequiredMixin,self).dispatch(request,*args,**kwargs)
尝试"两个":次要更改 将super-> MyPasswordChangeFrom更改为super-> PasswordChangeForm
尝试三:使用mixin,但不幸的是有与上面相同的结果.
尝试四:尚未完成,但最终选择?但必须有一种方法尽可能多地使用django的形式.
所以我的问题是...... 有人可以通过Django的PasswordChangeForm对如何将(经过身份验证的)用户对象传递给Django的SetPasswordForm提供一个提示或小解释,因此我可以尽可能多地使用当前存在的表单.
提前致谢!
小智 5
request
默认情况下不会发送到FormView
初始化时.你不得不以某种方式偷偷溜进去.
基于您的尝试#1,一个好方法是覆盖get_form_kwargs()
您的方法FormView
,并添加request
为它super
已经提供的字典的键.然后,使用kwargs
中MyPasswordChangeForm
的__init__
获得request
.
从根本上说,你会做以下事情:
class ChangePassword(LoginRequiredMixin, FormView):
template_name = 'users/reset_password.html'
form_class = PasswordChangeForm
def get_form_kwargs(self, **kwargs):
data = super(ChangePassword, self).get_form_kwargs(**kwargs)
data['request'] = self.request
return data
Run Code Online (Sandbox Code Playgroud)
然后,在你的Form的init中:
def __init__(self, *args, **kwargs):
request = kwargs.pop("request") # it's best you pop request, so that you don't get any complains for a parent that checks what kwargs it gets
super(MyPasswordChangeForm, self).__init__(request.user, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
525 次 |
最近记录: |