2016-07-28 10 views
2

Funktioniert die create-Funktion nicht gemäß den Modellspezifikationen? Hier ist mein Modell:Django validiert nicht beim Erstellen?

class Contact(models.Model): 
    id = models.AutoField(primary_key=True) 

    firstname = models.CharField(max_length=100, null=False, blank=False) 
    lastname = models.CharField(max_length=100, null=False, blank=False) 
    email = models.EmailField(max_length=150, blank=False, null=False) 
    active = models.BooleanField(default=True) 

Und ich benutze diese Funktion in meinem view:

new_contact = Contact.objects.create(firstname=a, 
    lastname=b, 
    email=c) 
# where a, b, & c are empty strings in request.POST, which shouldn't validate 

Der Aufruf von create durchläuft, ohne ein Problem. Aber das sollte nicht der Fall sein. Das Modell spezifiziert diese Felder nach Bedarf. In der Tat, wenn ich zum Admin-Panel gehe und dieses Objekt anschaue, kann ich es nicht speichern (ohne irgendwelche Änderungen vorzunehmen), weil es mich schreit, dass die Felder benötigt werden.

Ist das normale Verhalten für create nicht gültig?

Wie kann ich die Validierung erzwingen?

+0

@ e4c5 Ja, ich habe ein Formular erstellt, aber das hat mein Problem nicht gelöst. An dieser Stelle akzeptiere ich einfach mehrere Formulare in einer Ansicht. Es zwingt den Benutzer, eine Seitenaktualisierung durchzuführen, um dem Hauptmodell, das erstellt wird, zusätzliche Informationen hinzuzufügen, die ich nicht mag. – smilebomb

Antwort

0

Sie vermischen Formulare und Modelle.

Field.blank

Bei True wird das Feld leer sein darf. Standard ist Falsch.

Beachten Sie, dass dies anders als null ist. null ist rein Datenbank-bezogen, während leer ist Validierung bezogen. Wenn ein Feld leer = True ist, ermöglicht die Formularüberprüfung die Eingabe eines leeren Werts. Wenn ein Feld leer = False ist, wird das Feld benötigt.

Also ja, es ist normales Verhalten für das Modell, sich nicht mit der Validierung von Leerzeichen zu beschäftigen.

Wenn Sie sicherstellen möchten, dass die Benutzereingabe von Leerzeichen nicht in der Datenbank endet, sollten Sie dafür ModelForm verwenden. Es ist sehr un-django direkt wie request.POST der

+0

Korrekt. Es ist meine Situation, dass dieses Objekt, das erstellt wird, asynchron von dem Hauptformular ist, das übermittelt wird, und nur bedingt erforderlich ist. Ich habe kein Formular für dieses Modell definiert. – smilebomb

+0

Nun raten Sie, dass Sie jetzt eine erstellen oder eine Modelfactory verwenden müssen – e4c5

0

Von Django doc verwenden, heißt es, dass Sie explizit müssen Modellvalidierung verwandte Methoden aufrufen, das heißt full_clean, clean, zur Modellvalidierung zu übernehmen.

Sie können den in Django documentation verfügbaren Beispielen folgen, um Ihre eigene Validierungssequenz in Ihrem Modell zu implementieren.

Verwandte Themen