Django 自定义 PasswordResetView:__init__() 缺少 1 个必需的位置参数:'user'
Django Customize PasswordResetView: __init__() missing 1 required positional argument: 'user'
我尝试自定义 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 需要在初始化时带用户:
class SetPasswordForm(forms.Form):
. . .
def __init__(self, user, *args, **kwargs):
self.user = user
super().__init__(*args, **kwargs)
我没有找到如何将 user
数据传递给 PasswordResetView
和 PasswordResetForm
的明确解决方案,因为在创建 PasswordResetForm
实例时会使用用户数据。
SetPasswordForm
用于 PasswordResetConfirmView
视图,而不是 PasswordResetView
。在PasswordResetConfirmView
、get_form_kwargs()
method [Django-doc] is overridden with [GitHub]中:
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
<strong>kwargs['user'] = self.user</strong>
return kwargs
因此,您可能应该子类化 PasswordResetConfirm
视图,并使用 PasswordResetForm
表单作为 PasswordResetView
.
我尝试自定义 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 需要在初始化时带用户:
class SetPasswordForm(forms.Form):
. . .
def __init__(self, user, *args, **kwargs):
self.user = user
super().__init__(*args, **kwargs)
我没有找到如何将 user
数据传递给 PasswordResetView
和 PasswordResetForm
的明确解决方案,因为在创建 PasswordResetForm
实例时会使用用户数据。
SetPasswordForm
用于 视图,而不是 PasswordResetConfirmView
PasswordResetView
。在PasswordResetConfirmView
、get_form_kwargs()
method [Django-doc] is overridden with [GitHub]中:
def get_form_kwargs(self): kwargs = super().get_form_kwargs() <strong>kwargs['user'] = self.user</strong> return kwargs
因此,您可能应该子类化 PasswordResetConfirm
视图,并使用 PasswordResetForm
表单作为 PasswordResetView
.