2013-09-04 21 views
11

Ich hatte vor kurzem Probleme mit FormView und festgestellt, dass der Weg, dies zu tun war, get_form_kwargs verwenden.Neugierig auf get_form_kwargs in FormView

Hier ist mein Code:

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) 

Nachdem bei this post suchen, ich verstehe immer noch nicht, warum get_form_kwargs verwendet werden muss und warum mit self.request statt self.request.user in diesem Fall gibt __init__() got an unexpected keyword argument 'request'.

Kann mir das jemand erklären?

Vielen Dank für die Hilfe :)

Antwort

10

Das get_form_kwargs Verfahren ein Wörterbuch mit dem kwargs zurückkehren wird, die auf die __init__ Ihre Form weitergegeben werden. Nun, wenn Sie ein Formular haben, das ein Kwarg mit dem Namen user erwartet und übergeben Sie es ein Kwarg mit dem Namen request wird es mit dem Fehler, den Sie sehen, beschweren. Wenn Sie request statt user übergeben wollen (das ist, was ich in der Regel tun, da die Anforderung der Benutzer enthält), dann sollten Sie Ihre Form Klasse wie folgt definieren:

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

Können Sie mir sagen, wie sich meine Form erwarten 'Anfrage 'von meinem Code, wie ich es einfach als definieren könnte: ' def get_form_kwargs (self): kwargs = super (InternalResetPasswordView, selbst) .get_form_kwargs() kwargs ['anfrage'] = self.request zurück kwargs'. Sorry über die Formatierung, scheint keine Zeilenumbrüche zu funktionieren. –

+0

Mit der Methode '' 'def get_form-kwargs (self)' '' definieren Sie kein Formular, Sie definieren nur, welche Kwargs Ihre Ansicht an die Form weitergeben werden! Eine Django-Form erwartet bestimmte Kwargs. Wenn Sie versuchen, etwas zu übergeben, was nicht erwartet wird, wird es sich beschweren. Deshalb müssen Sie kwargs.pop() aufrufen, um die Anforderung zu entfernen, die Sie in Ihrer Form-Implementierung verwenden möchten, bevor Sie '' 'super() .__ init ___' '' aufrufen. – Serafeim

+0

Da FormView ein Formular instanziiert, wie nimmt es nicht "Anfrage" als Argument? Noob Frage hier>. < –