2012-01-13 9 views
0

models.py:models.pyにフィールド 'retyppassword'を持たずに、アカウントの登録/作成時にパスワードをretypepasswordと比較するにはどうすればいいですか?

class Users(models.Model): 
    username = models.CharField(max_length=255) 
    slug = models.CharField(max_length=255, default='0') 
    password = models.CharField(max_length=300) 
    passwordrepeat = models.CharField('Repeat Password', max_length=300) 
    password_token = models.CharField(max_length=300, default='0') 
    email = models.CharField(max_length=255) 
    email_verified = models.BooleanField(default=False) 
    email_token = models.CharField(max_length=255) 
    email_token_expiry = models.DateTimeField(auto_now_add=True) 
    tos = models.BooleanField(default=False) 
    active = models.BooleanField(default=False) 
    last_login = models.DateTimeField(auto_now_add=True) 
    last_action = models.DateTimeField(auto_now_add=True) 
    is_admin = models.BooleanField(default=False) 
    role = models.CharField(max_length=255, default='0') 
    created = models.DateTimeField(auto_now_add=True) 
    modified = models.DateTimeField(auto_now_add=True) 

    def __unicode__(self): 
     return self.username 

class UsersModelForm(forms.ModelForm): 
    class Meta: 
     model = Users 
     fields = ('username', 'password', 'passwordrepeat', 'email') 
     widgets = { 
      'password' : PasswordInput(), 
      'passwordrepeat' : PasswordInput(), 
     } 

views.py:テンプレートで

def register(request): 
    flag = True 
    possible = 'abcdefghijklmnopqrstuvwxyz' 
    token = '' 
    length = 10 
    i = 0 

    current_datetime = datetime.datetime.now() 

    user = UsersModelForm() 
    if request.method == 'POST': 
     userf = UsersModelForm(request.POST) 
     username = userf.data['username'] 
     password = userf.data['password'] 
     passwordrepeat = userf.data['passwordrepeat'] 
     email = userf.data['email'] 

     if password != passwordrepeat: 
      flag = False 
      passVariable = {'user':user, 'flag': False} 
      return render_to_response('register.html', passVariable, context_instance=RequestContext(request)) 

     elif password == passwordrepeat: 
      while i<10: 
       temp = random.choice(possible) 
       token = token + temp 
       i=i+1 

      userf.email_token = token 
      userf.email_token_expiry = current_datetime + timedelta(1) 
      userf.save() 
      return HttpResponseRedirect('/') 
    else: 
     return render_to_response('register.html', {"user": user, 'flag': True}, context_instance=RequestContext(request)) 

<div id="id_div_register"> 
    <form action="/register" method="POST">{% csrf_token %} 
     {{ user.as_p }} 
     <input type=submit value="Submit" /> 
    </form> 
</div> 

この形式はmodels.pyであるため、フィールドのテキストボックス 'repeatpassword' を作成し、 。 mysqlテーブルのフィールド/カラムにフィールド 'repeatpassword'を置いてはいけません。しかし、私はテンプレートで 'パスワード'と 'repeatpassword'を比較する必要があります。どうすればいいですか?

これらの2つを比較するには、テンプレートに 'password'と 'repeatpassword'が必要ですが、blog_usersのmysqlテーブルに 'repeatpassword'フィールドは必要ありません。どうすればいいですか?それは可能ですか?

+0

[フォームとフィールドの検証](https://docs.djangoproject.com/ja/1.3/ref/forms/validation/)。 – demalexx

答えて

6

あなたの必要性は、パスワードをチェックするために洗浄され、フォーム上の新しいフィールドが一致し、その後、あなたはあなたのビュー内でパスワードチェックを外すとform.is_valid()に置き換えることができます。以下のような何か:

class UsersModelForm(forms.ModelForm): 
    passwordrepeat = forms.PasswordInput() 
    class Meta: 
     model = Users 

    def clean(self): 
     cleaned_data = self.cleaned_data 
     password = cleaned_data.get("password") 
     passwordrepeat = cleaned_data.get("passwordrepeat") 
     if password != passwordrepeat: 
      raise forms.ValidationError("Passwords must match.") 

     return cleaned_data 
+0

models.pyの 'widgets'はどこですか?あなたが言うことを簡単に理解するために、完全なmodels.pyとviews.pyを投稿できますか? – shibly

+0

戻り値のインデントが 'cleaned_data' okか、それとも' def clean(self): 'の外ですか? – shibly

+0

クリーンメソッドを呼び出すのはいつですか? – shibly

2

モデルからpasswordrepeatを削除します。 UsersModelFormをpasswordrepeat入力に拡張します。 確認パスワードがUsersModelFormのカスタム検証(IS_VALID()メソッド)に一致しない

+0

あなたが言っていることを理解できない、完全なコードを投稿することは理解するのに役立ちます。 models.pyのコードを投稿できますか? – shibly

+0

Djangoのユーザ認証メカニズムを使用していない理由:https://docs.djangoproject.com/en/dev/topics/auth/#module-django.contrib.auth を拡張し、UserProfile(https: /docs.djangoproject.com/ja/dev/topics/auth/#storing-additional-information-about-users)を最初に使用しますか? – disorder

+0

models.pyは同じですが、 'passwordrepeat = models.CharField( 'Repeat Password'、max_length = 300)'フィールドを削除してください。 – disorder

12

あなたがこれを決してしないNEVER NEVERしなければなりません。

ユーザーのパスワードをデータベースにクリアに保存しています。 あなたはこれをしないでください

Djangoには、ハッシュを含めてパスワードを正しく保存するために必要なすべてのセキュリティを担う完全な組み込み認証フレームワークがあります。これを使って。それは複雑ではなく、実際に自分のものを転がすよりはるかに簡単です。

あなたの安全でないバージョンを取り除き、Djangoを使用してください。

+0

最初にアカウントを登録/作成してから認証するオプションが必要です。 – shibly

+3

どのようにコメントが私の答えに関係していますか?パスワードを格納するための安全でないシステムを作成しないでください。 Djangoを使用してください。登録メカニズムを上に置く必要がある場合は、[django-registration](https://bitbucket.org/ubernostrum/django-registration)のようなものを使用します。 –

+0

これらのdjango登録やdjango-authは私にとっては複雑です。だから私は自分で作る必要がある。 – shibly

関連する問題