2012-01-20 32 views
7

我目前使用django.contrib.auth.views.password_password_reset_confirm来更改用户的密码。这是我的网址怎么看:在Django密码中执行最小长度

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的主干 -

# 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

不会'如果len(password1)<7'接受一个pa长度为7的字(不是至少8)? – Dirk

回答

2

如果我理解正确,那么您正在修改django代码?因为这不能做到这一点。

你使用什么形式?看起来确实内置的PasswordChangeForm不会让你设置min_length。

也许你可以使用password_change视图并设置你自己的password_change_form,它可以继承基本的PasswordChangeForm,你可以应用附加的cleaning

+0

伟大的答案,我已经添加了另一个答案,我最终写的代码http://stackoverflow.com/a/20678355/340128 – Variant

4

我使用的是django-registration插件,我发现它非常出色,所以我的例子就是基于此。但是没有它,你可以做一件非常相似的事情。

This post通过如何覆盖django注册表单(在这种情况下为recaptcha垃圾邮件机器人阻止程序)来做好一个步骤。

你需要做的是重写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

6

,我理解亚瑟接受的答案后,最终编写的代码:

这是继承的形式:

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}),