2013-09-04 13 views
11

でget_form_kwargs興味私は最近、FormViewコントロールに問題があるし、それをやって行く方法がget_form_kwargsを使用していたことが判明しました。ここでは、FormViewコントロール

が私のコードです:

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) 

this postを見た後get_form_kwargsを使用する必要があり、なぜこのような場合には代わりにself.request.userのself.requestを使用していますなぜ、私はまだ理解していません__init__() got an unexpected keyword argument 'request'

誰かが私にこれを説明してもらえますか?すべての助けを

感謝:)

答えて

10

get_form_kwargs方法は、フォームの__init__に渡されますkwargsからで辞書を返します。今、もしあなたが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) 
+0

あなたは私のフォームは 'リクエストを期待しない方法を教えてもらえ:あなたはrequest代わりのuserを渡したいなら、あなたはこのようなフォームクラスを定義する必要があります(これは、要求が、ユーザーが含まれているので、私は通常、何をすべきかです) '私のコードから、私はちょうどとしてそれを定義することができますよう: 'デフget_form_kwargs(自己): kwargsから=スーパー(InternalResetPasswordView、自己).get_form_kwargs() kwargsから[ '要求'] = self.request リターンkwargs'。 フォーマットについてごめんね、改行が機能しないようです。 –

+0

'' def get_form-kwargs(self) ''メソッドでは、フォームを定義していないので、どのkwargsがフォームに渡すかを定義するだけです! django Formは特定のkwargsを予期します。期待していないものを渡そうとすると、それは不平を言うでしょう。そのため、 '' super().__ init ___ '' 'を呼び出す前に、フォーム実装で使用したいリクエストを削除するためにkwargs.pop()を呼び出す必要があります。 – Serafeim

+0

FormViewはフォームをインスタンス化するので、 'request'を引数としてどうやって取得しませんか? Noobの質問>。< –

関連する問題