Gần đây tôi gặp sự cố với FormView và thấy rằng cách để thực hiện việc đó là sử dụng get_form_kwargs.Tò mò về get_form_kwargs trong FormView
Đây là mã của tôi:
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)
Sau khi xem xét this post, tôi vẫn không hiểu tại sao get_form_kwargs đã được sử dụng và tại sao sử dụng self.request thay vì self.request.user trong trường hợp này mang lại cho __init__() got an unexpected keyword argument 'request'
.
Ai đó có thể giải thích điều này cho tôi không?
Cảm ơn tất cả sự giúp đỡ :)
Ông có thể cho tôi biết làm thế nào để hình thức của tôi mong đợi 'yêu cầu 'từ mã của tôi như tôi có thể chỉ định nghĩa nó là: ' def get_form_kwargs (self): kwargs = super (InternalResetPasswordView, self) .get_form_kwargs() kwargs ['request'] = self.request return kwargs'. Xin lỗi về định dạng, dường như không thể ngắt dòng để hoạt động. –
Với phương thức '' 'def get_form-kwargs (self)' '', bạn không định nghĩa một Form, bạn chỉ định nghĩa các kwarg sẽ vượt qua Form View của bạn! Biểu mẫu django mong đợi các kwargs cụ thể. Nếu bạn cố gắng vượt qua nó một cái gì đó mà không phải là dự kiến nó sẽ khiếu nại. Đó là lý do tại sao bạn phải gọi kwargs.pop() để xóa yêu cầu bạn muốn sử dụng trong việc thực hiện Biểu mẫu của bạn trước khi gọi '' 'super() .__ init ___' ''. – Serafeim
Vì FormView khởi tạo một biểu mẫu, làm thế nào để nó không lấy 'yêu cầu' làm đối số? Noob câu hỏi ở đây>. < –