2013-09-04 10 views
11

Ostatnio miałem problemy z FormView i odkryłem, że sposobem na zrobienie tego było użycie get_form_kwargs.Ciekawy temat get_form_kwargs w FormView

Oto mój kod:

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) 

Po obejrzeniu this post, ja nadal nie rozumiem, dlaczego ma być używany get_form_kwargs i dlaczego używając self.request zamiast self.request.user w tym przypadku daje __init__() got an unexpected keyword argument 'request'.

Czy ktoś mógłby mi to wyjaśnić?

Dzięki za wszelką pomoc :)

Odpowiedz

10

Sposób get_form_kwargs zwróci słownika z kwargs które zostaną przekazane do __init__ swojej postaci. Teraz, jeśli masz formularz, który oczekuje, że kwarg o nazwie user i przekaże go kwarg o nazwie request, będzie narzekał z powodu błędu, który widzisz. Jeśli chcesz przekazać request zamiast user (jest to co zwykle zrobić, ponieważ wniosek zawiera użytkownikowi) następnie należy zdefiniować klasę formularz takiego:

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

Czy możesz mi powiedzieć, w jaki sposób moja forma oczekiwać 'prośbę 'z mojego kodu tak jak mógłbym zdefiniować go jako: ' def get_form_kwargs (self): kwargs = super (InternalResetPasswordView, self) .get_form_kwargs() kwargs ['request'] = self.request return kwargs'. Przykro nam z powodu formatowania. Wydaje się, że nie działają podziały wiersza. –

+0

Za pomocą metody '' def get_form-kwargs (self) '' 'nie definiujesz formularza, tylko definiujesz, które kwargs przejdą Twój widok do formularza! Formularz django oczekuje określonego kwargs. Jeśli spróbujesz przekazać coś, czego się nie spodziewasz, będzie narzekać. Dlatego musisz wywołać kwargs.pop(), aby usunąć żądanie, które chcesz użyć w swojej implementacji Form przed wywołaniem '' 'super() .__ init ___' ''. – Serafeim

+0

Ponieważ FormView tworzy instancję formularza, w jaki sposób nie przyjmuje argumentu 'request'? Noob pytanie tutaj>. < –

Powiązane problemy