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?
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%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%Da ModelChoiceField von ChoiceField erbt, sollten Sie dafür das Widget MultipleHiddenInput verwenden :
%Vor%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.