django SetPasswordForm和AdminPasswordChangeForm

时间:2015-09-25 12:03:53

标签: django

我想尝试使用上述表格 - 但我得到了

__init__() takes at least 2 arguments (1 given)

我到达它应该显示的表单,但它从未向我保存新密码

我还需要改变:

def __init__(self, user, *args, **kwargs):
    self.user = user
    super(AdminPasswordChangeForm, self).__init__(*args, **kwargs)

到:

def __init__(self, *args, **kwargs):
    super(AdminPasswordChangeForm, self).__init__(*args, **kwargs)

因为它没有得到用户arg。

任何想法为什么?

THX

============================ edit ================== ===========================

class set(FormView):
    model = User
    form_class = AdminPasswordChangeForm
    template_name = 'set.html'
    def dispatch(self, request, *args, **kwargs):
        return super(set, self).dispatch(request, *args, **kwargs) 

    def get_form_kwargs(self):
        kwargs = super(set, self).get_form_kwargs()
        kwargs['user_to_update'] = the user
        return kwargs

init:

def __init__(self, *args, **kwargs):
    self.user = kwargs['user_to_update']
    kwargs.pop('user_to_update')
    super(AdminPasswordChangeForm, self).__init__(*args, **kwargs)

1 个答案:

答案 0 :(得分:1)

使用现有表格。覆盖视图的get_form_kwargs方法,将预期的参数传递给表单,而不是更改__init__方法,这会破坏其他内容。

要保存密码,您需要覆盖form_valid方法并致电form.save()

对于创建和更新视图,您并不总是需要覆盖form_valid,因为默认行为是保存表单并重定向。对于FormView,默认行为只是重定向,因此您必须覆盖它以使其执行任何有用的操作。

class SetPasswordView(FormView):
    form_class = AdminPasswordChangeForm
    template_name = 'set.html'
    success_url = '/thanks/'

    def get_form_kwargs(self):
        kwargs = super(set, self).get_form_kwargs()
        kwargs['user_to_update'] = the user
        return kwargs

    def form_valid(self, form):
        form.save()
        return super(SetPasswordView, self).form_valid(form)