web-dev-qa-db-ja.com

FormViewのget_form_kwargsに興味がある

最近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_form_kwargsを使用する必要があるのか​​、またこの場合self.request.userの代わりにself.requestを使用する必要があるのに__init__() got an unexpected keyword argument 'request'が得られないのか、まだわかりません。

誰かがこれを私に説明できますか?

すべての助けをありがとう:)

20

get_form_kwargsメソッドは、フォームの__init__に渡されるクワーグを含む辞書を返します。ここで、userという名前のkwargを想定しているフォームがあり、requestという名前のkwargを渡すフォームがある場合、表示されるエラーが表示されます。 requestの代わりにuserを渡したい場合(これは、リクエストにユーザーが含まれているため、私が通常行うことです)、次のようにフォームクラスを定義する必要があります。

 class RequestForm(forms.Form):
 def __init __(self、* args、** kwargs):
 self.request = kwargs.pop( 'request'、None) 
 super(RequestForm、self).__ init __(* args、** kwargs)
18
Serafeim