[Django] ModelForm mit Foreignkey

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
BerlinerMC
User
Beiträge: 25
Registriert: Montag 8. Dezember 2008, 19:32

Hallo Community,

ich komme seit Stundenlangem suchen nicht weiter -.-
Also ich habe nun folgendes Problem:

Ich habe ein Model A (Benutzerprofil Tabelle )welches von Model B (Benutzertabelle) abhängig ist und beide sind mittels einem Foreignkey verbunden.

Nun erstelle ich mit Model A eine Form (ModelForm). Also eine Benutzerprofil Seite wo der Benutzer in der Lage sein soll, seine Persönlichen Daten zu ersetzen / ändern etc.!

Nun bekomme ich beim Speichern der angegebenen Daten die Probleme. Und zwar sind beide Tabellen / Models mit einem Foreignkey verbunden (Attribut user_id)!

Nun möchte ich das Attribut User Id der Tabelle mittels einer Session variable user id abspeichern. Das geht aber leider nicht da die Daten per POST übertragen werden und dort die User id natürlich nicht mit bei ist sondern in der session variable.

Also nachdem das Script form.is_valid() ausführt bricht er ab und erklärt mir das User Id nicht leer sein darf => Was ja auch richtig ist. Was kann ich tun der ganzen Form Geschichte mitzuteilen das die user id nicht mittels einer POST Übermittlung kommt sondern eben in der Session variable ist?!

Mit initial und dem ganzen Quark hat es leider nicht geklappt :(

Ich hoffe ihr könnt den Text verstehen ^^

Lg
Alex / Berliner
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

User ID aus der form lassen (exclude). Später dann einfügen, wenn die form valide ist. Oder nicht direkt speichern, sondern anschließend den User einfügen:

Code: Alles auswählen

form.save(commit=False)
form.user = ...
form.save()

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BerlinerMC
User
Beiträge: 25
Registriert: Montag 8. Dezember 2008, 19:32

jens hat geschrieben:User ID aus der form lassen (exclude). Später dann einfügen, wenn die form valide ist. Oder nicht direkt speichern, sondern anschließend den User einfügen:

Code: Alles auswählen

form.save(commit=False)
form.user = ...
form.save()
Hallo Jens,
auch diese Methode versuchte ich vorgestern, aber leider ging damit auch nichts!
Ich bekomme folgende Fehlermeldung

Code: Alles auswählen

Exception Value:  	

Cannot assign "2 (User Id => Der Session wert)": "UserProfile.userId (Benutzerprofil Tabelle)" must be a "User (Benutzer Tabelle)" instance.
Was die Fehlermeldung bedeutet ist mir schon klar, jedoch wie ich das beheben kann nicht :(
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Nun ohne deinen Code zu sehen, wird dir keiner helfen können/wollen. Warum sollen wir raten was du falsch machst -_-

EDIT:// btw es ist sinnvoll einfach die exception zu pasten und nicht darin rumzumurksen…
Zuletzt geändert von apollo13 am Donnerstag 3. September 2009, 13:09, insgesamt 1-mal geändert.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich kann auch nur raten. Du hast die ID des User aus der Session und übergibst die *Nummer*.
Versuche es doch einfach anhand der ID Nummer den User aus der DB zu holen und übergibst dann das User Objekt.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BerlinerMC
User
Beiträge: 25
Registriert: Montag 8. Dezember 2008, 19:32

jens hat geschrieben:Ich kann auch nur raten. Du hast die ID des User aus der Session und übergibst die *Nummer*.
Versuche es doch einfach anhand der ID Nummer den User aus der DB zu holen und übergibst dann das User Objekt.
Ich konnte es mir zwar nicht vorstellen, aber du hast recht. Es muss das gesamte User Objekt sein!

Vielen dank. Habe für diese Kleinigkeit wirklich viele Tage gebraucht -.-
Naja nun kann es ja weitergehen :)

Lg
Alex / Berliner
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Wobei im Grunde für die DB die User ID reicht. Denn die ID ist gleich dem pk und im Grunde wird ja eh nur der gespeichert.

Mein Code war auch IMHO falsch. Glaube so könnte es gehen:

Code: Alles auswählen

instance = form.save(commit=False)
instance.user = ...
instance.save()

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

btw wenn man nur die id zur Hand hat:

Code: Alles auswählen

instance.user_id = 3
sollte auch gehen
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

oder evtl. instance.user_pk ?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BerlinerMC
User
Beiträge: 25
Registriert: Montag 8. Dezember 2008, 19:32

Also so funktioniert es

Code: Alles auswählen

            profile = setForm.save(commit=False);
            profile.userId = request.user;
            profile.save()
Wobei request.user das gesamte User Objekt ist!
Gebe ich hinter profile.userId eine Zahl an oder die Session variable, erklärt mir der Compiler wieder das er ein User Objekt benötigt
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

BerlinerMC hat geschrieben: Gebe ich hinter profile.userId eine Zahl an oder die Session variable, erklärt mir der Compiler wieder das er ein User Objekt benötigt
das ist klar, wobei ich hoffe du hast dein atrribut nicht wirklich profile.userId genannt ;)

Code: Alles auswählen

class Dummy()
  user = ForeignKey

c = Dummy()
c.user = user_instance
# die zeile über mir und unter mir sollten mehr oder weniger das gleiche bewirken
c.user_id = user_instance.pk # über das user_id bin ich mir nicht sicher, vlt heißt es wie jems sagte user_pk, aber gehen tut es so auch...
Antworten