2016-07-02 18 views
1

私はCheckoutビューで通常/ゲストユーザで作業していますが、整合性エラーを回避するのに苦労しています。アイデアは、ゲストユーザーがチェックアウトにのみ電子メールで登録できるようにすることで、ユーザーの電子メールを一意に設定する必要があります。私のカートの見解でDjango IntegrityError電子メールが一意ではありません

models.py

from django.conf import settings 
from django.db import models 

class UserCheckout(models.Model): 
    user = models.OneToOneField(settings.AUTH_USER_MODEL, null=True, blank=True) 
    email = models.EmailField(unique=True) 

    def __unicode__(self): 
     return self.email 

forms.py

from django import forms 
from django.contrib.auth import get_user_model 

User=get_user_model() 
class GuestCheckoutForm(forms.Form): 
    email = forms.EmailField() 
    email2 = forms.EmailField(label='Verify Email') 
    def clean_email2(self): 
     email = self.cleaned_data.get("email") 
     email2 = self.cleaned_data.get("email2") 
     if email == email2: 
      user_exists = User.objects.filter(email=email).count() 
      if user_exists != 0: 
       raise forms.ValidationError("User already exists. Please login instead") 
      return email2 
     else: 
      raise forms.ValidationError("Please confirm emails addresses are the same.") 

これは私が私のフォームをレンダリングしてきた方法です。

def post(self, request, *args, **kwargs): 
     self.object = self.get_object() 
     form = self.get_form() 
     if form.is_valid(): 
      email = form.cleaned_data.get("email") 
      user_checkout = UserCheckout.objects.create(email=email) 
      return self.form_valid(form) 
     else: 
      return self.form_invalid(form) 

は私が管理してモデルを登録したと管理にそれは完全に罰金が、フロントエンドから、私は下のエラーを取得しています重複のエラーを示しています使用されているForm

IntegrityError at /checkout/ 
column email is not unique 
Request Method: POST 
Request URL: http://localhost:8000/checkout/ 
Django Version: 1.8.13 
Exception Type: IntegrityError 
Exception Value:  
column email is not unique 
Exception Location: C:\Users\Ali\ecomm\lib\site-packages\django\db\backends\sqlite3\base.py in execute, line 318 
Python Executable: C:\Users\Ali\ecomm\Scripts\python.EXE 
Python Version: 2.7.9 
+0

私が正しく理解していれば、あなたのフォームは有効ではなく、 'IntegrityError'になります。 – aumo

+0

私がしたいのは、ユーザーが既に存在する場合、登録する代わりにログインするメッセージがポップアップするはずだということです。 –

答えて

2

で置き換えます。チェックアウトが発生するたびに新しいUserCheckoutが作成されます。これらすべてのエントリーでは、すべての電子メールが1回だけ存在することが許可されています。

私はあなたがこれを望むとは思わない。ゲストが2回発注した場合、彼の電子メールはすでにDBに入っているため許可されていないためです。そしてそれがあなたがこのエラーを起こす理由です。

1

clean_<fieldname>方法を単一のフィールドに関連する検証を実行する。複数のフィールドにアクセスする検証が必要な場合は、cleanメソッドを使用してください。完全な説明については、フォーム検証でdocumentationを確認してください。

class GuestCheckoutForm(forms.Form): 
    email = forms.EmailField() 
    email2 = forms.EmailField(label='Verify Email') 

    def clean_email(self): 
     email = self.cleaned_data["email"] 
     if User.objects.filter(email=email).exists(): 
      raise forms.ValidationError("Please confirm emails addresses are the same.") 
     return email 

    def clean(self): 
     cleaned_data = super(GuestCheckoutForm, self).clean() 
     email = cleaned_data.get('email') 
     email2 = cleaned_data.get('email2') 

     if email and email2 and email != email2: 
      self.add_error('email2', forms.ValidationError('Please confirm emails addresses are the same.')) 

EDIT:を私はあなたがIntegrityErrorを得た理由は、私が見つけたと信じて: あなたが指定したメールとはUserがデータベースにされていない、あなたもなければならないことを検証している与えるだろう

指定された電子メールの他にUserCheckoutがデータベースに存在しないことを確認します。 if User.objects.filter(email=email).exists():if User.objects.filter(email=email).exists() or UserCheckout.objects.filter(email=email).exists():

+0

私はpython 2.7でsuper()を呼び出さないようにしています。最後に、ValidationErrorは解決できません。エラーが表示されます。 super()は少なくとも1つの引数をとります(0が指定されています) –

+0

問題が投稿されたのと同じエラーです。何も変わっていません。しかし、私はあなたの意見を持っています。しかし、これは私に、論理がきれいである限り完全性エラーをキャッチして変更する考えを与えました。それは良いアイデアだと思いますか? –

+0

私はそれが解決策だと思っていますが、醜いものは、あなたが明らかにどこかに隠れているかもしれないバグがあります。 P.-S.私の編集を見たことがありますか? – aumo

関連する問題