Weitere Django-Formulare: Fremdschlüssel im versteckten Feld

8

Eine weitere Frage zu Django Form.

Mein Formular:

%Vor%

Besitzer im Modell ist ein ForeignKey für ein Profil.

Wenn ich dieses Formular einrichte, setze ich den Wert von "Eigentümer" auf ein Profilobjekt.

Aber wenn dies auf dem Formular erscheint, scheint es den Namen des Profils wie folgt zu enthalten:

%Vor%

Wenn das Formular abgeschickt wird und zu meiner views.py zurückkehrt, versuche ich es so zu behandeln:

%Vor%

Allerdings bekomme ich einen Fehler bei der Typkonvertierung, weil die Zeichenfolge "phil" (der Name des Benutzers, der im Feld "owner" gespeichert wurde) nicht in Int umgewandelt werden kann, um sie in ForeignKey zu verwandeln.

Also, was ist hier los? Sollte ein ModelForm einen Fremdschlüssel als Nummer darstellen und transparent behandeln? Oder muss ich die ID selbst in das Besitzerfeld des Formulars extrahieren? Und wenn ja, wie und wann ordne ich es zurück, BEVOR ich versuche, das Formular zu validieren?

    
interstar 07.03.2009, 02:59
quelle

5 Antworten

15

Ich vermute, dass die Methode __unicode__ für die Profilmodellinstanz oder die repr davon einen anderen Wert als self.id zurückgibt. Zum Beispiel habe ich das einfach eingerichtet:

%Vor%

Damit sehe ich PlanForm.profile so in der Vorlage gerendert:

%Vor%     
ayaz 07.03.2009, 14:40
quelle
9

Hmm ...

Dies könnte tatsächlich eine Sicherheitslücke sein.

Angenommen, ein böswilliger Angreifer hat einen POST erstellt (z. B. mithilfe von XmlHttpRequest von FireBug) und den Profilterm auf einen verrückten Wert gesetzt, z. B. Ihre Profil-ID. Wahrscheinlich nicht was du wolltest?

Wenn möglich, möchten Sie das Profil möglicherweise aus dem Anforderungsobjekt und nicht aus den POST-Werten abrufen.

%Vor%     
quelle
6

Wenn Sie dem Formular ein Profilobjekt zuweisen, schreibt Django es und verwendet die Ausgabe als Wert im Formular. Was Sie jedoch vermeiden würden, ist, dass Django stattdessen die ID des Objekts verwendet.

Glücklicherweise ist die Problemumgehung einfach: Geben Sie stattdessen nur die Primärschlüsselwerte der Profilobjekte an:

%Vor%

Auf der anderen Seite, wenn Sie mit gebundenen Formen arbeiten, arbeiten sie jedoch viel vernünftiger:

%Vor%     
Guðmundur H 07.03.2009 12:57
quelle
2

Da ModelChoiceField von ChoiceField erbt, sollten Sie dafür das Widget MultipleHiddenInput verwenden :

%Vor%     
dustinfarris 20.11.2012 17:54
quelle
1

Normalerweise müssen verwandte Objekte nicht in das Formularfeld eingefügt werden. Es gibt einen besseren Weg und dies ist die Angabe der Eltern-ID in der URL des Formulars.

Nehmen wir an, Sie müssen ein Formular für ein neues Plan-Objekt rendern und dann ein Formular erstellen, wenn das Formular übertragen wird. So würde Ihre Urlconf aussehen:

%Vor%

Und wenn Sie ein bestehendes Objekt ändern, brauchen Sie nur plan_id, Sie können daraus alle zugehörigen Datensätze ableiten.

    
Alexander Lebedev 07.03.2009 10:37
quelle

Tags und Links