Django Настроить PasswordResetView: __init__() отсутствует 1 необходимый позиционный аргумент: «пользователь»

#python #django #django-models #django-views #django-forms

Вопрос:

Я пытаюсь настроить Django PasswordResetView для проверки длины пароля, но получаю эту ошибку:

 TypeError at /accounts/password_reset/
__init__() missing 1 required positional argument: 'user'
 

views.py

 from django.contrib.auth import views as auth_views

class PasswordResetView(auth_views.PasswordResetView):
    form_class = PasswordResetForm
    template_name = "accounts/users/password_reset.html"
    email_template_name = "accounts/users/password_reset_email.html"
    subject_template_name = "accounts/users/password_reset_subject.txt"
    from_email = settings.EMAIL_HOST_USER
    success_url = reverse_lazy("accounts_password_reset_done")
 

forms.py

 from django.contrib.auth.forms import SetPasswordForm

class PasswordResetForm(SetPasswordForm):

    def clean_new_password1(self):
        password = self.cleaned_data.get("new_password1")
        if len(password) < 12:
            raise forms.ValidationError("Password must be at least 12 characters.")
        return password
 

Очевидно, что класс SetPasswordForm должен быть выбран пользователем при инициализации:

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

Я не нахожу четкого решения о том, как передавать user данные PasswordResetView и PasswordResetForm потому, что данные пользователя используются при PasswordResetForm создании экземпляра.

Комментарии:

1. SetPasswordForm Используется в PasswordResetConfirmView представлении, а не в PasswordResetView .

Ответ №1:


SetPasswordForm Используется в PasswordResetConfirmView представлении, а не в PasswordResetView . В PasswordResetConfirmView , get_form_kwargs() метод [Django-doc] переопределяется с помощью [GitHub]:

 def get_form_kwargs(self):
    kwargs = super().get_form_kwargs()
    kwargs['user'] = self.user
    return kwargs 

Таким образом, вы, вероятно, должны подклассировать PasswordResetConfirm представление и работать с PasswordResetForm формой для PasswordResetView .

Комментарии:

1. Ух ты! Какой быстрый ответ и точный ответ. Я всегда ценю ваши ответы на SO и вклад в сообщество Django. Я действительно благодарен вам за ваши усилия.