2013-09-04 2 views
11

최근에 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) 

this post보고 후, 난 여전히 get_form_kwargs가 사용되는 이유를 이해하고 왜이 경우 대신 self.request.user의 self.request주는 ​​사용하지 않습니다 여기에

내 코드입니다 __init__() got an unexpected keyword argument 'request'.

누군가이 설명을 해줄 수 있습니까? 모든 도움

감사합니다 :)이 get_form_kwargs 방법은 양식의 __init__에 전달 될 kwargs로와 사전을 반환합니다

답변

10

. 이제 kwarg가 user이라고 예상되는 양식이 있고 kwarg를 request으로 전달하면 표시되는 오류가 발생합니다.

 
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)''메소드를 사용하여 Form을 정의하지 않으면, 어떤 kwargs가 당신의 View에 전달 될지를 정의하는 것입니다! django Form은 특정 kwargs를 예상합니다. 예상치 못한 것을 전달하려고하면 불평 할 것입니다. 그래서''super() .__ init ___'''을 호출하기 전에 폼 구현에서 사용하고자하는 요청을 제거하기 위해 kwargs.pop()을 호출해야합니다. – Serafeim

+0

FormView는 폼을 인스턴스화하기 때문에 어떻게'request'를 인자로 취하지 않습니까? 멍청한 질문이 여기에 있습니다. < –

관련 문제