2013-09-04 21 views
11

Son zamanlarda FormView ile ilgili bir sorun yaşadım ve bunu yapmanın yolunun get_form_kwargs kullanmak olduğunu fark ettim.FormView'da get_form_kwargs hakkında meraklılık

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 baktıktan sonra, hala get_form_kwargs kullanılacak neden anlamak ve neden bu durumda yerine self.request.user arasında self.request verir kullanarak yoktur: Burada

benim kodudur __init__() got an unexpected keyword argument 'request'.

Birisi bunu bana açıklayabilir mi? Tüm yardım için

Teşekkür :) get_form_kwargs yöntem formun __init__ geçilecek kwargs bir sözlük dönecektir

cevap

10

. Eğer user ve adlandırılmış bir kwarg o request adında bir kwarg geçmesi beklediği şekliniz varsa Şimdi, gördüğünüz hata ile şikayet edecektir.

 
class RequestForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop('request', None) 
     super(RequestForm, self).__init__(*args, **kwargs) 
+0

sen benim form 'isteği bekler nasıl söyler misiniz: Eğer request yerine user geçmek istiyorsanız o zaman bu gibi form sınıfı tanımlamak gerekir (bu istek kullanıcı içerdiğinden Ben genellikle ne olduğunu) 'benim kodundan sadece olarak tanımlayabilirsiniz olarak: ' def get_form_kwargs (öz): kwargs = süper (InternalResetPasswordView, kendinden) .get_form_kwargs() kwargs [ 'istek'] = self.request dönüş kwargs'. Biçimlendirmeyle ilgili özür dilerim, çalışmak için satır sonları görünmüyor. Eğer bir Formunu tanımlayan değil '' 'def get_form-kwargs (öz)' '' metodu ile –

+0

, sen kwargs senin Form görünümüne türünü geçecek olan sadece tanımlamaya vardır! Bir django formu belirli kwargs bekliyor. Eğer beklenmedik bir şey geçmeye çalışırsanız şikayet eder. Eğer '' 'süper çağırmadan önce size form uygulamasında kullanmak istediğiniz istek kaldırmak için) (kwargs.pop aramak zorunda yüzden() .__ init ___' ''. FormView bir form başlatır yana – Serafeim

+0

, nasıl bir argüman olarak 'request' almaz? Noob sorusu burada. < –