对于FormView中的get_form_kwargs好奇 [英] Curious about get_form_kwargs in FormView
问题描述
我最近遇到了FormView的麻烦,发现要做的就是使用get_form_kwargs。
I was having trouble with FormView recently and found that the way to go about doing it was to use 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_form_kwargs,为什么使用self.request而不是self.request.user在这种情况下给出 __ init __()得到一个意想不到的关键字参数'request'
。
After looking at this post, I still don't understand why get_form_kwargs has to be used and why using self.request instead of self.request.user in this case gives __init__() got an unexpected keyword argument 'request'
.
有人可以向我解释吗?
感谢所有帮助:)
推荐答案
get_form_kwargs
方法将返回一个带有kwargs的字典,将传递给 __ init __
您的表单。现在,如果您有一个希望使用名为用户
的kwarg并将其传递给名为请求
的kwarg的表单,则会抱怨你看到的错误如果要通过请求
而不是用户
(这是我通常做的,因为请求包含用户)你应该这样定义你的表单类:
The get_form_kwargs
method will return a dictionary with the kwargs that will be passed to the __init__
of your form. Now, if you have a form that expects a kwarg named user
and pass it a kwarg named request
it will complain with the error you see. If you want to pass request
instead of user
(this is what I usually do since the request contains the user) then you should define your form class like this:
class RequestForm(forms.Form):
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request', None)
super(RequestForm, self).__init__(*args, **kwargs)
这篇关于对于FormView中的get_form_kwargs好奇的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!