2016-07-15 42 views
1

如果您在使用Django 1.8或更改用户更改密码时,是否可以强制实施最小密码长度?当用户在我的网站上创建自己的帐户时,我会在注册表单中使用自定义验证程序强制执行最低密码长度。但是,当用户想要更改密码时,我会调用Django的auth_views.password_change方法,该方法指定使用的表单和验证条件。在Django版本中指定最小密码长度<= 1.8?

# account/urls.py 
from django.conf.urls import url 
from django.contrib.auth import views as auth_views 
urlpatterns = [ 
    ... 
    url(r'^password_change/$', 
     auth_views.password_change, 
     {'template_name': 'password_change_form.html'}, 
     name='password_change'), 
    ... 
] 

由于我没有验证他们的新密码,用户将能够将其更改为一个不符合我的最小长度标准。除了猴子补丁之外,还有什么办法可以做这个验证吗?这个Stackover question讨论了一种可行的方法,但它适用于您正在实施身份验证的情况,而我只允许经过身份验证的用户更改其现有密码。我知道Django 1.9会通过AUTH_PASSWORD_VALIDATORS设置提供此功能,但在我的网站上线之前,我没有时间升级到1.9。

+0

可以使一个新的形式从'PasswordChangeForm'继承,定制“new_password1”字段'clean_new_password1'(添加验证),并添加在你的** url **中使用'{'password_change_form':CustomPasswordChangeForm}来呈现这个表单,而不是默认的表单。你可以使用视图,如果你想看到[这里](http://stackoverflow.com/questions/26457279/passwordchangeform-with-custom-user-model),如果它可以帮助 – kapilsdv

回答

1

您可以自定义默认PasswordChangeForm形式,并通过password_change_form额外的选项,通过URL来查看功能指向您的CustomPasswordChangeForm形式,而默认的。

from django.contrib.auth.forms import PasswordChangeForm 


class CustomPasswordChangeForm(PasswordChangeForm): 
    """ 
    A Custom PasswordChangeForm for minimum password length validation. 
    """ 

    def clean_new_password1(self): 
     """ 
     Validates that the new_password1. 
     """ 
     password = self.cleaned_data.get('new_password1') 
     # Add your custom validation 
     if len(password) < 8: 
      raise ValidationError('Password too short') 
     return password 

并更改网址:

from django.conf.urls import url 
from django.contrib.auth import views as auth_views 
from _where_ import CustomPasswordChangeForm #import the CustomPasswordChangeFormform 

urlpatterns = [ 
    ... 
    url(r'^password_change/$', 
     auth_views.password_change, 
     {'template_name': 'password_change_form.html', 'password_change_form': CustomPasswordChangeForm}, 
     name='password_change'), 
    ... 
] 
+0

这几乎工作。它确实捕获的密码太短,但如果输入了有效的密码并重新提交表单,则会引发AttributeError,“'super'对象没有属性'clean_new_password1'”。我在调试器中运行它并确认没有这种方法。你有没有意思别的?我想知道你是否真的意思是“超级(CustomPasswordChangeForm,..)”但是会引发同样的错误。 – William

+0

我没有测试它。它只是在飞行中编码。另外''超级'(PasswordChangeForm)对象没有属性'clean_new_password1',它是'self'(CustomPasswordChangeForm)。使用'return password'而不是'super(..)' – kapilsdv

+0

感谢您提供隐藏字段的建议。我已经适当地更改了我的代码。 – William