#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. Я действительно благодарен вам за ваши усилия.