Django 对FormView中的get_form_kwargs感到好奇

Django 对FormView中的get_form_kwargs感到好奇,django,django-views,formview,django-generic-views,Django,Django Views,Formview,Django Generic Views,最近,我在FormView上遇到了麻烦,我发现使用get_form_kwargs是解决这个问题的方法 这是我的密码: class InternalResetPasswordView(FormView): template_name = 'reset_password.html' form_class = forms.InternalPasswordResetForm # success_message = "Password was reset successfully" # To get

最近,我在FormView上遇到了麻烦,我发现使用get_form_kwargs是解决这个问题的方法

这是我的密码:

class InternalResetPasswordView(FormView):

template_name = 'reset_password.html'
form_class = forms.InternalPasswordResetForm

# success_message = "Password was reset successfully"

# To get request object
# http://notesondjango.wordpress.com/2012/12/18/modelform-formview-and-the-request-object/
# https://stackoverflow.com/questions/13383381/show-message-after-password-change
# http://pydanny.com/simple-django-email-form-using-cbv.html
# http://bubuzzz.wordpress.com/2012/05/01/class-based-generic-views-in-django-a-simple-sample/
def get_form_kwargs(self):
    kwargs = super(InternalResetPasswordView, self).get_form_kwargs()
    kwargs['user'] = self.request.user
    return kwargs

def get_success_url(self):
    return reverse('user-detail', kwargs={'pk': self.request.user.id})

@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
    return super(InternalResetPasswordView, self).dispatch(*args, **kwargs)   

'''
def get_context_data(self, **kwargs):

    context = super(InternalResetPasswordView, self).get_context_data(**kwargs)
    context['InternalPasswordResetForm'] = context.get('form')

    return context


def get_form_kwargs(self):
    kwargs = super(InternalResetPasswordView, self).get_form_kwargs()
    kwargs['request'] = self.request
    return kwargs

'''
# self.request.user method obtained from
# https://docs.djangoproject.com/en/dev/topics/class-based-views/generic-editing/
def form_valid(self, form):
    current_password = form.cleaned_data['old_password']
    new_password =  form.cleaned_data['new_password1']
    confirm_new_password = form.cleaned_data['new_password2']
    user = self.request.user
    if user.check_password(current_password) and new_password == confirm_new_password:
        user.set_password(new_password)
        user.save()
        # form.valid() redirects to get_success_url
    return super(InternalResetPasswordView, self).form_valid(form)
看了之后,我仍然不明白为什么必须使用get\u form\u kwargs,为什么要使用self.request而不是self.request.user在本例中给出
\uuuu init\uuu()得到一个意外的关键字参数“request”

有人能给我解释一下吗


感谢所有的帮助:)

方法将返回一个包含kwargs的字典,该字典将被传递到表单的
\u init\u
。现在,如果您有一个表单需要一个名为
user
的kwarg,并将一个名为
request
的kwarg传递给它,它将抱怨您看到的错误。如果您希望传递
请求
而不是
用户
(这是我通常做的,因为请求包含用户),那么您应该如下定义表单类:

class RequestForm(forms.Form): def __init__(self, *args, **kwargs): self.request = kwargs.pop('request', None) super(RequestForm, self).__init__(*args, **kwargs) 类请求表单(forms.Form): 定义初始化(self,*args,**kwargs): self.request=kwargs.pop('request',None) super(RequestForm,self)。\uuuuuu init\uuuuuuu(*args,**kwargs)
你能告诉我我的表单如何从我的代码中得到请求吗?因为我可以将它定义为:
def get_form_kwargs(self):kwargs=super(InternalResetPasswordView,self)。get_kwargs()kwargs['request']=self.request return kwargs
。很抱歉设置了格式,似乎无法使换行符正常工作。使用
def get_form-kwargs(self)
方法,您不是在定义表单,而是在定义哪些kwargs将视图传递给表单!django表单需要特定的Kwarg。如果你试图传递一些意想不到的东西,它会抱怨。这就是为什么在调用
super()之前必须调用kwargs.pop()来删除要在表单实现中使用的请求的原因。既然FormView实例化了表单,它如何不将
请求
作为参数?这里没有问题>。在您的
InternalResetPasswordView
中,您正在传递一个
form\u class=forms.InternalPasswordResetForm
。因此,FormView需要实例化一个
InternalPasswordResetForm
实例,并将get\u form\u kwargs()方法的结果传递给该实例的
\uuuu init\uuuuuuu
!因此,在
InternalPasswordResetForm
中,在将kwargs字典传递给super之前,您必须删除其中的任何额外参数!错误不在
表单视图
实现中,而在
表单
中!