2010-11-19 12 views
22

Ich habe ein Django-Formular mit einer Reihe von Feldern, die ich in der Vorlage rendere. Ich habe auch einige direkte HTML-Eingabeelemente, die ich in der Ansicht validieren möchte, indem ich auf die request.POST vars zugreife. Wenn diese nicht validiert werden, möchte ich einen Fehler in das Django-Formular einfügen, damit ich es auf der Seite anzeigen kann. Gibt es eine Möglichkeit, das zu tun?Django: Hinzufügen von non_field_error aus Sicht?

Antwort

28

Sie können auch ziemlich elegante add_error() Methode verwenden. Arbeitet für Django> = 1.7.

Wenn Sie field als None Form setzen, wird der Fehler als "non_field" behandelt. So :

form.add_error(None, "I'm non-field error")

funktioniert wie ein Zauber.

+1

Für Django> = 1.7 – AliBZ

+1

Danke. Ich habe meine Antwort aktualisiert. – grafa

6

Nun, Sie können alles in das errors Wörterbuch des Formulars einfügen, und Feldfehler gehen in errors['__all__'].

Aber warum halten Sie einige Felder aus dem Django-Formular heraus, nur um ihre Fehler am Ende wieder einzufügen? Warum nicht alle Felder in die Form bringen? Wenn Sie nur eine Modellform verwenden und Felder hinzufügen möchten, können Sie dies in Django tun, indem Sie einfach die Felder auf der Formularebene deklarieren - dann können Sie für sie innerhalb des Formulars saubere Methoden definieren.

class ExtendedModelForm(forms.ModelForm): 
    extra_field_1 = forms.CharField() 
    extra_field_2 = forms.CharField() 

    def clean_extra_field_1(self): 
     ...etc... 
+0

Siehe meine andere Frage für Argumentation: http://StackOverflow.com/Questions/4228722/Django-CheckboxSelectMultiple Das Feld erfordert eine Vielzahl von Anpassungen, die irgendwie schwierig ist, es in der Form zu tun. – mpen

+1

@Mark nur, weil Sie die Anzeige anpassen möchten, bedeutet nicht, dass Sie das Feld nicht in das Formular für die Zwecke der Validierung und Fehleranzeige einschließen können. –

+1

Richtig .. wenn ich es richtig nenne, wird Django den Unterschied nicht wissen, oder? – mpen

21

Hinzufügen zu Daniels Antwort, die spezifische Syntax:

form.errors['__all__'] = form.error_class(["error msg"]) 

Beachten Sie, dass '__all__' mit der konstanten NON_FIELD_ERRORS für eine bessere Kompatibilität ersetzen können (Kredit grafa).

from django.forms.forms import NON_FIELD_ERRORS