2015-12-30 5 views
0

Добрый день, SO!не может передать параметр 'user' в ChangePasswordForm в django

Я изучаю Django (1.8) с классами. Сам Django предоставляет модуль аутентификации с возможностью изменения пароля пользователя. При использовании PasswordChangeForm в Джанго (который расширяет SetPasswordForm Джанго), я натыкаюсь на следующее сообщение об ошибке:

init() missing 1 required positional argument: 'user'

Когда я смотрю на класс SetPasswordForm, я могу видеть это требует пользовательский объект в качестве параметра ,

def __init__(self, user, *args, **kwargs): 
    self.user = user 
    super(SetPasswordForm, self).__init__(*args, **kwargs) 


Что я изначально делать?
Во-первых, на мой взгляд, я просто назначен PasswordChangeForm в Джанго:

class ChangePassword(LoginRequiredMixin, FormView): 
    template_name = 'users/reset_password.html' 
    form_class = PasswordChangeForm 

Что привело к ошибке, конечно, потому что ни один пользователь-объект не предусмотрен.

Итак, что я попытался решить эту проблему?

Попытка один: Пользовательские формы, который наследует от PasswordChangeForm и добавляет метод инициализации.
Поскольку PasswordChangeForm не имеет инициализации метод, я упаковали новый класс формы под названием MyPasswordChangeForm, который наследуется от PasswordChangeForm и добавляет INIT:

class MyPasswordChangeForm(PasswordChangeForm): 
    def __init__(self, request, *args, **kwargs): 
     super(MyPasswordChangeForm, self).__init__(request.user, *args, **kwargs) 

Ожидаемый результат: MyPasswordChangeForm-> унаследовать от PasswordChangeForm и добавить init-> супер init-> выполнить Инициализировать SetPasswordForm
Фактический результат: супер зовет LoginRequiredMixin:

init() missing 1 required positional argument: 'request'
stack-tr l:80 return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs)

попытка «два»: незначительные изменения Изменение супер-> MyPasswordChangeFrom для супер-> PasswordChangeForm

Покушение три: используя подмешать, но имел такой же результат, как и выше, к сожалению.

Попытка четыре: еще не сделано, но будет ли окончательный вариант? Но должен быть способ использовать формы джанго как можно больше.

Так что мой вопрос ... Может кто-нибудь дать подсказку или небольшое объяснение о том, как я могу передать (с проверкой подлинности) пользовательский объект SetPasswordForm в Джанго с помощью PasswordChangeForm Джанго, так что я могу использовать столько, сколько возможных существующих форм.

Заранее благодарен!

ответ

5

request по умолчанию не отправлен FormView при инициализации. Вы должны каким-то образом прокрасть его туда.

Основываясь на вашу попытку # 1, хороший способ сделать это переопределение метода get_form_kwargs() в вашем FormView и добавьте request как ключ к Dict это super уже обеспечивает. Затем используйте kwargs в MyPasswordChangeForm__init__, чтобы получить request.

Esentially, вы могли бы сделать что-то вроде:

class ChangePassword(LoginRequiredMixin, FormView): 
    template_name = 'users/reset_password.html' 
    form_class = PasswordChangeForm 

    def get_form_kwargs(self, **kwargs): 
     data = super(ChangePassword, self).get_form_kwargs(**kwargs) 
     data['request'] = self.request 
     return data 

А потом, в инициализации вашей формы:

def __init__(self, *args, **kwargs): 
    request = kwargs.pop("request") # it's best you pop request, so that you don't get any complains for a parent that checks what kwargs it gets 
    super(MyPasswordChangeForm, self).__init__(request.user, *args, **kwargs)