2016-07-15 2 views
1

Возможно ли обеспечить минимальную длину пароля, если вы используете Django 1.8 или ниже, когда пользователь меняет свой пароль? Когда пользователь создает свою учетную запись на моем веб-сайте, я применяю минимальную длину пароля, используя специальный валидатор в моей форме регистрации. Однако, когда пользователь хочет изменить свой пароль, я вызываю метод auth_views.password_change Django, который определяет используемые формы и критерии проверки.Укажите минимальную длину пароля в версии 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' (добавить проверку), а также добавить '{'password_change_form': CustomPasswordChangeForm},' в вашем ** url **, чтобы отобразить эту форму, а не по умолчанию. Вы можете использовать представление, если хотите, см. [Здесь] (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 

И изменить 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'), 
    ... 
] 
+0

Это почти работает. Он улавливает слишком короткий пароль, но если вы затем вводите правильный пароль и повторно отправляете форму, возникает атрибут AttributeError, «супер» объект не имеет атрибута «clean_new_password1». Я запустил это в отладчике и подтвердил, что такого метода нет. Возможно, вы имели в виду что-то еще? Мне было интересно, действительно ли вы имели в виду «super (CustomPasswordChangeForm, ..)», но это вызывает ту же ошибку. – William

+0

Я не тестировал его. Это было просто закодировано на лету. Также объект '' super '(PasswordChangeForm) не имеет атрибута' clean_new_password1'', его 'self' (CustomPasswordChangeForm), который имеет его. Используйте 'return password' вместо' super (..) ' – kapilsdv

+0

Спасибо за совет по скрытым полям. Я изменил свой код соответствующим образом. – William

Смежные вопросы