2012-01-20 22 views
7

私は現在、ユーザのパスワードを変更するのにdjango.contrib.auth.views.password_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 

確かに良い方法がなければならない

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のトランクに直接それをやっている:これは私のURLはどのように見えるかです。

+0

が 'lenの場合(パスワード)<7' PAを受け入れることはありません長さ7のssword(少なくとも8ではない)? – Dirk

答えて

2

正しく理解すれば、djangoコードを変更していますか?それは単にそれを行う方法ではありえないからです。

どのような形式を使用しますか?組み込みのPasswordChangeFormでは、min_lengthを設定することはできません。

password_changeビューを使用して、独自のpassword_change_formを設定することができます。これは、基本的なPasswordChangeFormから継承し、さらにcleaningを適用することができます。

+0

偉大な答え、私は最終的に書いたコードで別の答えを追加しましたhttp://stackoverflow.com/a/20678355/340128 – Variant

4

私は優秀であると分かったdjango登録プラグインを使用しています。私の例はそれに基づいています。しかし、あなたはそれなしで非常に似たようなことをすることができます。

This post django登録用のフォーム(およびウィジェット)を無効にする方法(この場合は、recaptcha spam-botブロッカー)を適切に実行するのは良いことです。

は何をする必要がRegistrationFormクラスをオーバーライドします(下記のような)とFormクラスでは(デフォルト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 

の代わりにそれを使用するために、Djangoは関数を探しますあなたのurls.pyを指していますその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をspecifingによって:

url(r'^forgot_password/reset/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$', 
                'django.contrib.auth.views.password_reset_confirm', 
                {'set_password_form':SetPasswordWithMinLengthForm}), 
関連する問題