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 :)
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. –
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
Ponieważ FormView tworzy instancję formularza, w jaki sposób nie przyjmuje argumentu 'request'? Noob pytanie tutaj>. < –