Setzen Sie das Benutzerfeld in ein Formularobjekt, das mit ModelForm erstellt wurde

Ich habe ein Anmeldeformular, dass, wenn der Benutzer in gültige Registrierungsdaten in ihm eintritt, es den Benutzer einloggt und den Benutzer zu einem anderen Formular umleitet, um weitere Daten einzugeben. Dieses neue Formular enthält mehr Daten über den Benutzer und wird mit der untenstehenden ModelForm-Klasse erstellt:

class UserProfileAddForm(ModelForm): class Meta: model = UserProfile exclude = ('user') 

Und das UserProfile-Modell sieht aus wie:

 class UserProfile(models.Model): GRADE_YEAR_CHOICES = ( ('FR', 'Freshman'), ('SO', 'Sophomore'), ('JR', 'Junior'), ('SR', 'Senior'), ('GR', 'Graduate') ) school = models.CharField(max_length=64) grade_year = models.CharField(max_length=2, choices=GRADE_YEAR_CHOICES) gpa = models.DecimalField(decimal_places=2, max_digits=6, blank=True, null=True) user = models.ForeignKey(User, unique=True) 

Wo das Benutzerfeld ein ForeignKey zu Djangos Benutzerobjekt ist. Ich habe eine harte Zeit Einstellung der Benutzer-Feld an den Benutzer die Anforderung. Hier habe ich in meinen views.py versucht

Erster Versuch:

 def more(request): if request.method == 'POST': form = UserProfileAddForm(request.POST) if form.is_valid(): form.save(commit=False) form.user = request.user form.save() return HttpResponseRedirect('/register/success/') else: form = UserProfileAddForm() variables = RequestContext(request, { 'form': form 

Zweiter Versuch:

 def more(request): if request.method == 'POST': form = UserProfileAddForm(request.POST) if form.is_valid(): form.save(commit=False) form.user = User.objects.filter(username=request.user) form.save() return HttpResponseRedirect('/register/success/') else: form = UserProfileAddForm() variables = RequestContext(request, { 'form': form }) return render_to_response('registration/more.html', variables) 

So oder so versuche ich es nicht, die Daten in der Datenbank zu speichern. Es wird mich aber auf die Erfolgseite umleiten, als ob es erfolgreich war.

3 Solutions collect form web for “Setzen Sie das Benutzerfeld in ein Formularobjekt, das mit ModelForm erstellt wurde”

form.save() gibt eine Instanz des zu speichernden Modells zurück. Es ist dort, dass Sie den Benutzer setzen müssen, dann speichern Sie diese Instanz.

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

Beachten Sie, dass der Benutzer aus der Datenbank basierend auf dem Wert von request.user ist sinnlos, da request.user bereits das richtige User-Objekt ist.

Mein Vorschlag ist, dass Sie diese Änderung im zweiten Versuch machen:

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

Problem ist, dass Sie user Eigenschaft hinzufügen, form Objekt insteat zu form.instance Objekt zu bilden.

Bearbeitet

Als ich die erste Antwort gepostet habe, habe ich mich in der Benutzerzuweisung verwechselt. @Dirk hat es kommentiert und jetzt ist behoben. Danke @Dirk. Problem war, dass ein Abfrage-Set with_profile.user insteat ein einziges Modell zugeordnet ist.

Nun, was Sie verstehen müssen, ist, dass Sie die Modellinstanz bekommen, wenn Sie dies in Ihrem Fall tun

 profile = form.save(commit =False) 

Und wenn du das Modellobjekt rettest, speichert es keine viel zu viele Beziehungen. Was Sie nach dem Speichern des Modellobjekts tun müssen. Auf diese Weise,

 form.save_m2m() 

Also, füge einfach das letzte Stück Code hinzu, nachdem du das Modellobjekt gespeichert hast.

  • Wie extrahiere ich HTTP-Nachrichtentext in BaseHTTPRequestHandler.do_POST ()?
  • Selen: Versuche, sich mit Cookies anzumelden - "Kann nur Cookies für aktuelle Domain setzen"
  • Senden Sie die Datei mit dem POST aus einem Python-Skript
  • Http anfragen: von urllib2 auf anfragen python 2.7
  • Erfordert Python-Requests OrderedDicts, oder geht hier etwas anderes?
  • Django - Werte aus POST-Anfrage
  • Looping durch eine Liste von Tupeln, um eine POST-Anfrage mit jedem Tupel zu machen
  • Flasche - POST Fehler 405 Methode nicht zulässig
  • Custom Django Rest Parser
  • Python urllib2 Datei Upload Probleme
  • Django - POST, um ein Wörterbuch zurückzugeben, in dem die Werte Listen sind
  • Python ist die beste Programmiersprache der Welt.