Обеспечение минимальной длины в пароле Django

В настоящее время я использую django.contrib.auth.views.password_password_reset_confirm для изменения пароля пользователя. Вот как выглядят мои URL-адреса:

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

конечно, должен быть лучший способ.

3 ответов


Если я правильно понимаю, вы изменяете код django? Потому что это просто не может быть способом сделать это.

какую форму вы используете? Кажется, действительно, что встроенный PasswordChangeForm не позволит вам установить min_length.

может быть, вы могли бы использовать password_change просмотрите и установите свою собственную форму password_change_form, которая может наследовать от базовой формы PasswordChangeForm, к которой вы можете применить дополнительные уборка.


код, который я в конце концов написал после понимания принятого ответа Артура:

это унаследованная форма:

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

Я использую плагин django-registration, который я нашел отличным, поэтому мой пример основан на этом. Но вы могли бы сделать то же самое без него.

этот пост хорошо справляется с тем, как переопределить форму (и виджет) для Django-регистрации-в этом случае для блокатора спам-ботов recaptcha.

что вам нужно сделать, это переопределить класс RegistrationForm (как показано ниже) и указать urls.py использовать его вместо форма регистрации по умолчанию

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

(в классе формы 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