在 Django 版本 <= 1.8 中指定最小密码长度?

Specify Minimum Password Length in Django Version <= 1.8?

如果您使用的是 Django 1.8 或更低版本,当用户更改密码时是否可以强制执行最小密码长度?当用户在我的网站上创建他们的帐户时,我会在我的注册表单中使用自定义验证器强制执行最小密码长度。然而,当用户想要更改他们的密码时,我调用 Django 的 auth_views.password_change 方法来指定所使用的表单和验证标准。

# 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。

您可以自定义默认的 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

并更改 url:

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'),
    ...
]