2010-10-06 18 views
10

Ok, ich habe stundenlang damit angefangen zu versuchen herauszufinden, was los ist, ohne Erfolg. Ich versuche, eine ModelForm mit dem Schlüsselwort 'instance' zu erstellen, um eine vorhandene Modellinstanz zu übergeben und anschließend zu speichern. Hier ist die Modelform (deutlich vom Original in meinen Versuchen beraubt die Ursache dieses Problems zu identifizieren):Django ModelForm schlägt fehl Validation ohne Fehler

class TempRuleFieldForm(ModelForm): 
    class Meta: 
     model = RuleField 

und hier ist der Code, ich bin mit:

>>> m = RuleField.objects.get(pk=1) 
>>> f = TempRuleFieldForm(instance=m) 
>>> f.is_valid() 
False 

Das Model-Objekt (m oben) ist gültig und es spart gut, aber das Formular wird nicht validiert. Nun, soweit ich das beurteilen kann, ist dieser Code identisch mit dem hier gefundenen Django-Dokument: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method, obwohl mir offensichtlich etwas fehlt. Ich wäre sehr dankbar für ein paar frische Augen, um mir zu sagen, was ich falsch gemacht habe.

Dank

+2

Was "f.errors" ausdruckt? – sdolan

Antwort

21

Beachten Sie, dass Ihr Link nicht f.is_valid() nicht nennen, es spart nur direkt. Dies ist möglicherweise ein bisschen irreführend.

Der Punkt ist, dass ein Formular mit nur einem instance Parameter Instanziieren aber kein data tut nicht binden sie an Daten, und die Form ist daher nicht gültig. Sie werden sehen, dass f.is_bound False ist.

Hinter den Kulissen ist instance wirklich genau das selbe wie initial Daten zu übergeben, die als die Dokumentnotiz nur verwendet wird, um die Daten anfänglich anzuzeigen und nicht zum Speichern verwendet wird. Sie würden wahrscheinlich davon profitieren, die notes on bound and unbound forms zu lesen.

+3

+1. "Instanz bedeutet nicht gebunden": Dies ist eine korrekte Argumentation. –

+0

Danke, das macht Sinn. Ich wusste, dass es etwas Einfaches wäre ... – oogles

+0

Nur zur Klarstellung, der Grund, warum ich f.is_valid() benutzte, war einfach, die Frage präziser zu machen. Die Verwendung von f.save() schlägt mit einem AttributeError im Feld cleaned_data fehl, das erst existiert, wenn das Formular validiert wird. Also selbst wenn ich den Code _exactly_ benutzte, wie es in dem Link ist, den ich gepostet habe (mit f.save() anstelle von f.is_valid()), war es immer noch fehlgeschlagen. – oogles

3

Wenn Sie das Objekt, das sich in der Datenbank befand, immer noch validieren möchten, können Sie es zuerst serialisieren und dann das Formular damit erstellen. Dieser

from django.utils import simplejson 
from django.core.serializers import serialize 

(...) 

fields_dict = simplejson.loads(serialize('json', [obj]))[0]['fields'] 
form = forms.MyForm(fields_dict) 
if form.is_valid 

ist wahrscheinlich nicht der beste Weg, es zu tun, aber das einzige, das ich gefunden habe, eine gebundene Form von einem Modell zu bekommen. Ich brauche es, weil ich die aktuellen Daten in der Datenbank validieren möchte. Erstelle ich eine Frage, da ich nicht glaube, das ist der beste Weg, es zu tun:

Transform an unbound form to a bound one?

+2

zu machen, mir fehlte die ganze Sache "Daten an das Formular binden", was Sie mit der Serialisierung erreichen . Ich glaube, Djangos django.forms.models.model_to_dict wäre zwar besser als die genannte Serialisierung - siehe meine Antwort auf Ihre Frage: [link] (http://stackoverflow.com/questions/8993749/transform-an-unbound-form-to -a-gebunden-eins # 8996585). – oogles

0

Dies ist keine Lösung für die OP ist, aber es ist für den Post-Titel, das ist ziemlich hoch in Google. Ich poste es trotzdem, von here:

Wenn Sie bereits Anfrage.POST zu Ihrem Formular mit request.POST or None geben, aber es ist immer noch ohne Fehler ungültig, überprüfen Sie, dass es keine Weiterleitung geht. Eine Weiterleitung verliert Ihre POST-Daten und Ihr Formular wird ohne Fehler ungültig, da es nicht gebunden ist.