Django Formen: Foreign Key in Hidden-Feld
Meine form:
class PlanForm(forms.ModelForm):
owner = forms.ModelChoiceField(label="",
queryset=Profile.objects.all(),
widget=forms.HiddenInput())
etc...
class Meta:
model = Plan
Besitzer, in der Modell, ist ein ForeignKey zu einem Profil.
Wenn ich dieses Formular habe ich den Wert von "Eigentümer" zu werden, ein Profil-Objekt.
Aber wenn das raus kommt auf die form scheint zu enthalten, die Namen das Profil wie dieses:
<input type="hidden" name="owner" value="phil" id="id_owner" />
Wenn das Formular abgeschickt wird und wieder bekommt meine views.py ich versuche, es zu handhaben wie dieser:
form = PlanForm(request.POST)
...
if form.is_valid():
plan = form.save()
return HttpResponseRedirect('/plans/%s'%plan.id) # Redirect after POST
Allerdings, was ich sehe, ist ein Typ-Fehler bei der Konvertierung, wie Sie es versäumt, drehen Sie die Zeichenfolge "phil" (der name des Benutzer, der gespeichert wurde, in die "Besitzer" - Feld) in einen Int, um Sie in die ForeignKey.
Also, was ist hier Los. Sollte eine ModelForm stellen einen Fremdschlüssel als Zahl und transparent umgehen? Oder Brauch ich zu extrahieren der id mich in dem Eigentümer-Feld des Formulars? Und wenn ja, wie und Wann muss ich die Karte zurück, BEVOR ich versuche, die zur Validierung der form?
- wie sind Sie mit der Einstellung der Wert der Besitzer, wenn Sie die form. Können wir das erkennen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich vermute, dass die
__unicode__
Methode für das Profil-Modell-Instanz, oder dierepr
davon zurück gesetzt einen anderen Wert alsself.id
. Zum Beispiel, ich habe gerade diese up:Mit, dass ich sehen PlanForm.Profil gerendert, also in der Vorlage:
Hmm...
Dies könnte tatsächlich zu einem Sicherheitsproblem werden.
Angenommen, ein Angreifer gestaltete einen BEITRAG (z.B. durch Verwendung von XmlHttpRequest aus FireBug) und die Profil-Begriff zu einigen abgedrehten Wert, wie Ihre Profil-ID. Wahrscheinlich nicht das was du wolltest?
Wenn möglich, möchten Sie vielleicht, um das Profil aus dem request-Objekt selbst, sondern als das, was vorgelegt wird, aus der POST-Werte.
commit=False
trick meinen Tag gerettet, danke.Wenn Sie ein Profil zuweisen-Objekt auf das Formular, Django stringifies es und verwendet die Ausgabe als Wert in der form. Was Sie erwarten würden, obwohl, ist für Django zu verwenden, die ID des Objekts statt.
Glücklicherweise ist die Abhilfe ist einfach: Sie geben der form primary key Werte der Profil-Objekten statt:
Am anderen Ende, wenn man mit gebundenen Formularen arbeiten Sie jedoch viel sinnvoller:
Seit ModelChoiceField erbt von ChoiceFIeld, sollten Sie die MultipleHiddenInput widget für diese:
Gibt es in der Regel nicht notwendig, bezogen Objekt in form-Feld. Gibt es einen besseren Weg, und das ist die Angabe, parent-id in Formular-URL.
Nehmen wir an, Sie brauchen, um eine form darzustellen, die für die neue Plan-Objekt und erstellen Sie dann ein, wenn die form ist bubmitted. Hier erfahren Sie, wie Ihre urlconf würde wie folgt Aussehen:
Und wenn Sie die änderung von bestehenden Objekt -, alles, was Sie brauchen, ist plan_id, können Sie entnehmen, alle zugehörigen Datensatz aus es.