2016-07-02 11 views
1

Ich arbeite an meiner Checkout-Ansicht mit regulären/Gast-Benutzer, aber es wird schwer, um die Integrität Fehler zu kommen. Idee ist es, Gastbenutzer mit E-Mail nur zur Kasse zu gehen und ich muss die Benutzer-E-Mail eindeutig festlegen.Django IntegrityError E-Mail ist nicht eindeutig

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.") 

In den Warenkorb sieht dies ist, wie ich meine Form gemacht habe.

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) 

Ich habe das Modell mit Admin und Admin registriert es zeigt den Fehler für die Vervielfältigung völlig in Ordnung, aber vom Frontend bin ich Fehler immer unter:

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

Wenn ich richtig verstehe, ist Ihre Form gültig, wenn es nicht sollte, und es resultiert ein 'IntegrityError'? – aumo

+0

Alles, was ich vorhabe, ist, dass, wenn der Benutzer bereits existiert, die Meldung angezeigt werden sollte, um sich einzuloggen, anstatt sich zu registrieren. –

Antwort

2

Sie erstellen jedes Mal, wenn eine Überprüfung auftritt eine neue UserCheckout. Und in all diesen Einträgen ist es nur erlaubt, dass jede Email nur einmal existiert.

Ich glaube nicht, dass Sie das wollen. Denn wenn ein Gast zwei Mal bestellt, ist das nicht erlaubt, weil seine E-Mail bereits in der DB ist. Und deshalb bekommst du diesen Fehler.

1

Die clean_<fieldname> Methoden eines Form verwendet werden Validierung relativ zum einzelnen Feld durchführen. Wenn Sie eine Validierung mit Zugriff auf mehrere Felder benötigen, verwenden Sie die Methode clean. Überprüfen Sie die documentation auf Formularvalidierung für eine gründliche Erklärung. sein Sie Validierung sind, dass kein User mit der angegebenen E-Mail in der Datenbank ist, sollten Sie auch:

Das würde:

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: Ich glaube, ich fand heraus, warum Sie eine IntegrityError bekam Validierung, dass keine anderen UserCheckout mit der angegebenen E-Mail in der Datenbank ist. Ersetzen Sie if User.objects.filter(email=email).exists(): durch if User.objects.filter(email=email).exists() or UserCheckout.objects.filter(email=email).exists():

+0

Es lässt mich super() in Python 2.7 aufrufen. Zweitens ist ValidationError in der letzten Zeile nicht auflösbar. Es zeigt einen Fehler an. super() benötigt mindestens 1 Argument (0 gegeben) –

+0

Gleicher Fehler wie in Frage gestellt. Nichts hat sich geändert. Aber ich habe deinen Standpunkt verstanden. Allerdings gab mir das eine Idee, den Integritätsfehler zu erfassen und zu ändern, solange die Logik sauber ist. Denkst du, dass das eine bessere Idee ist? –

+0

Ich denke, das ist eine Lösung, aber eine hässliche, du hast eindeutig einen Fehler irgendwo, den du verstecken wirst und der dich später beißen kann. P.-S. Hast du meine Bearbeitung gesehen? – aumo

Verwandte Themen