我目前正在使用django.contrib.auth.views.password_password_reset_confirm
来更改用户的密码。这是我的网址的样子:
from django.contrib.auth import views as auth_views
url(r'^password/reset/confirm/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$',
redirect_if_loggedin(auth_views.password_reset_confirm),
name='auth_password_reset_confirm'),
目前,我正在直接进入django trunk -
# django.contrib.auth.views
def clean_new_password2(self):
password1 = self.cleaned_data.get('new_password1')
password2 = self.cleaned_data.get('new_password2')
if password1 and password2:
if len(password1) < 8:
raise forms.ValidationError(_("Password must be at least 8 chars."))
if password1 != password2:
raise forms.ValidationError(_("The two password fields didn't match."))
return password2
当然必须有更好的方法。
答案 0 :(得分:6)
我在理解了Arthur接受的答案后最终写的代码:
这是继承的形式:
class SetPasswordWithMinLengthForm(SetPasswordForm):
"""
Inherited form that lets a user change set his/her password without
entering the old password while validating min password length
"""
def clean_new_password1(self):
password1 = self.cleaned_data.get('new_password1')
if len(password1) < 4:
raise ValidationError("Password must be at least 4 chars.")
return password1
在urls.py
中,您可以通过指定set_password_form
来指示视图使用自定义表单:
url(r'^forgot_password/reset/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$',
'django.contrib.auth.views.password_reset_confirm',
{'set_password_form':SetPasswordWithMinLengthForm}),
答案 1 :(得分:4)
我正在使用django-registration插件,我发现它很优秀,所以我的例子就是基于此。但如果没有它,你可以做一件非常相似的事情。
This post在如何覆盖django-registration的表单(和小部件)方面做得很好 - 在这种情况下是一个recaptcha spam-bot阻止程序。
您需要做的是覆盖RegistrationForm类(如下所示)并指向您的urls.py以使用它而不是默认的RegistrationForm
class MinPasswdLenRegistrationForm(RegistrationForm):
min_password_length = 8
def clean_password1(self):
" Minimum length "
password1 = self.cleaned_data.get('password1', '')
if len(password1) < self.min_password_length:
raise forms.ValidationError("Password must have at least %i characters" % self.min_password_length)
else:
return password1
(在Form类中,django将查找以clean_
开头的函数,并以字段名称(如password1
)结束,以便在表单验证期间执行。)
另一个重要的方面是使用urls.py中的表单,如下所示:
from django.conf.urls.defaults import *
from registration.views import register
from myapp.forms import MinPasswdLenRegistrationForm
urlpatterns = patterns('',
url(r'^register/$', register,
{'form_class': MinPasswdLenRegistrationForm},
name='registration.views.register'),
(r'', include('registration.urls')),
)
HTH
答案 2 :(得分:2)
如果我理解正确,你是在修改django代码吗?因为那不可能是这样做的。
您使用什么形式?事实上,内置的PasswordChangeForm不会让你设置min_length。
也许您可以使用password_change视图并设置自己的password_change_form,它可以从您可以应用其他cleaning的基本PasswordChangeForm继承。