2013-09-04 22 views
11

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 đỡ :)

Trả lời

10

Phương pháp get_form_kwargs sẽ trở lại một cuốn từ điển với kwargs đó sẽ được chuyển đến các __init__ của mẫu của bạn. Bây giờ, nếu bạn có biểu mẫu mong muốn một kwarg có tên là user và chuyển nó thành kwarg có tên request, nó sẽ khiếu nại với lỗi bạn thấy. Nếu bạn muốn vượt qua request thay vì user (đây là những gì tôi thường làm kể từ khi yêu cầu chứa người sử dụng) thì bạn nên xác định lớp form như thế này:

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

Ô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. –

+0

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

+0

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>. < –

Các vấn đề liên quan