2016-07-02 2 views
1

Я работаю над своим просмотром Checkout с обычным/гостевым пользователем, но при этом сложно найти ошибку целостности. Идея заключается в том, чтобы гостевые пользователи регистрировались с помощью электронной почты только для проверки, и мне нужно установить уникальную электронную почту пользователя.Django IntegrityError e-mail не уникален

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) 

Я зарегистрировал модель с администратором и администратором он показывает ошибку дублирования прекрасно, но из фронтэнда я получаю ошибку ниже:

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

The clean_<fieldname> методов в Form используется для выполнения проверки относительно одного поля. Если вам нужна проверка с доступом к нескольким полям, используйте метод 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

Его не позволяет мне вызвать super() в python 2.7. Во-вторых, в последней строке ValidationError не разрешается. Он показывает ошибку. super() принимает не менее 1 аргумент (0 задано) –

+0

Такая же ошибка, как и в вопросе. Ничего не изменилось. Но я понял. Однако это дало мне идею поймать и изменить ошибку целостности, поскольку логика чиста. Как вы думаете, это лучшая идея? –

+0

Я думаю, что это решение, но уродливое, у вас явно есть ошибка где-то, что вы будете скрываться, и это может вас укусить позже. P.-S. Вы видели мое редактирование? – aumo

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