2016-07-15 6 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''から継承新しいフォームを作ることができ、また追加:

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を変更あなたの** url **の '{'password_change_form':CustomPasswordChangeForm} 'は、デフォルトのフォームではなくこのフォームをレンダリングします。あなたが望むならviewを使うことができます。助けがあれば[here](http://stackoverflow.com/questions/26457279/passwordchangeform-with-custom-user-model)を参照してください – kapilsdv

答えて

1

デフォルトPasswordChangeFormフォームをカスタマイズして、デフォルトの1むしろあなたCustomPasswordChangeFormフォームを指すようにURLを通じて機能を表示するpassword_change_formの追加オプションを渡すことができます。 (あなたの検証を追加)clean_new_password1` `で 'new_password1' フィールドをカスタマイズし、

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」という属性はありません。私はデバッガでこれを実行し、そのような方法がないことを確認しました。おそらく別のことを意味しましたか?私はあなたが本当に "super(CustomPasswordChangeForm、..)"を意味するのだろうかと思っていましたが、同じエラーが発生します。 – William

+0

私はそれをテストしなかった。それはただのフライでコード化されました。また、 '' super '(PasswordChangeForm)オブジェクトには' clean_new_password1 'という属性がありません。それは 'self'(CustomPasswordChangeForm)です。 'super(..)の代わりに' return password'を使用してください。 – kapilsdv

+0

隠されたフィールドに関するアドバイスをありがとう。コードを適切に変更しました。 – William

関連する問題