2016-09-19 3 views
2

Wie kann ich Django-Sitzungen verwenden, damit ein Benutzer ein Formular auf einer Seite starten und zur nächsten Seite wechseln kann und das Formular ausfüllen?Django 1.9 mit Django-Sitzungen in zwei Seitenformularen

Ich habe Paginierung und Zauberformulare untersucht, aber ich verstehe sie überhaupt nicht.

Wenn ich eine Seite mit einer kleinen Portion eines Modells habe, die ich benutze - in Formularen - und eine andere Seite mit dem Rest des Modells - forms.py mit dem Rest der Modellinfo - kann ich die erste Form perfekt verwenden . Wenn ich auf die nächste Seite gehe, erhalte ich die Fehlermeldung (1048, "Column 'user_id' cannot be null").

Meine beste Schätzung ist es, Django-Sitzungen zu verwenden, um dieses Problem zu beheben. Ich möchte nicht, dass der Benutzer seinen Benutzernamen und sein Passwort ein zweites Mal eingeben muss, damit dies funktioniert. Irgendwelche Ideen?

meine Modelle/forms.py:

class Contact(models.Model): 
    user = models.OneToOneField(User) 
    subject = models.CharField(max_length=100, blank=True) 
    sender = models.EmailField(max_length=100, blank=True) 
    message = models.CharField(max_length=100, blank=True) 

    def __str__(self): 
     return self.user.username 


class UserForm(forms.ModelForm): 
    password = forms.CharField(widget=forms.PasswordInput()) 

    class Meta: 
     model = Contact 
     fields = ('username', 'password', 'email') 


class ContactForm1(forms.Form): 
    class Meta: 
     model = Contact 
     fields = ('subject', 'sender') 


class ContactForm2(forms.Form): 
    message = forms.CharField(widget=forms.Textarea) 

    class Meta: 
     model = Contact 
     fields = ('message',) 

Ansichten:

def contact(request): 
    registered = False 
    if request.method =='POST': 
     user = UserForm(request.POST) 
     contact = ContactForm1(request.POST) 
     if user.is_valid() and contact.is_valid(): 
      user = user.save() 
      user.set_password(user.password) 
      user.save() 
      contact = contact.save(commit=False) 
      contact.user = user 
      registered = True 
    return render(request, 'mysite/contact.html', {'user': user, 'contact': contact, 'registered': registered}) 

def contact_second(request): 
    if request.method =='POST': 
     contact = ContactForm2(request.POST) 
     if contact.is_valid(): 
      contact = contact.save(commit=False) 
      contact.save() 
    return render(request, 'mysite/contact_two.html', {'contact': contact} 

Antwort

1

Ich denke, es ist eine gute Idee Sitzungen verwenden, um die Formulare zu speichern, weil Sie auf jeder Seite will nicht Speichern Sie die Benutzereingaben in der Datenbank, denn was passiert, wenn sie auf der 3. Seite ihre Meinung ändern und die Registrierung oder was auch immer löschen möchte?

Ich denke, es ist besser, die Formulare in Sitzung zu speichern, bis Sie auf der letzten Seite erhalten, stellen Sie sicher, dass alles gültig ist und speichern Sie dann die Daten in der Datenbank.

Also sagen wir, dass der folgende Code in einer der Ansichten ist, die das erste Formular/die Seite bedienen. Sie rufen die Daten aus der POST-Anforderung ab, und Sie überprüfen, ob die angegebenen Daten gültig sind, indem Sie form.is_valid() verwenden. Anschließend speichern Sie die form.cleaned_data (die die validierten Daten des Benutzers enthält) in einer Sitzungsvariablen.

form = CustomForm(request.POST) 
... 
if form.is_valid(): 
    request.session['form_data_page_1'] = form.cleaned_data 

Hinweis hier, dass Sie Code hinzufügen müssen, um den Benutzer auf die nächste Seite zu umleiten if form.is_valid() wahr ist, so etwas wie diese:

if form.is_valid(): 
    request.session['form_data_page_1'] = form.cleaned_data 
    return HttpResponseRedirect(reverse('url-name-of-second-page')) 

dann in jeder anderen Ansicht des in der Ansicht sagen lassen, dass wird die zweite Seite dienen Sie die von Daten von der ersten Seite wie diese retreive kann:

first_page_data = request.session['form_data_page_1'] 

Und Sie können tun, was Sie mit ihnen wollen, als ob es nach dem ex In der ersten Ansicht wurde die form.is_valid() ausgeführt.

+0

würde ich dies in beiden Ansichten setzen? Ich bin mir nicht sicher, wie ich es von einer Ansicht zur anderen senden kann. Ich habe meine Dateien oben hinzugefügt. Vielen Dank! – Robby

+0

@Robby Ich habe meine Antwort aktualisiert. – Rafael

+0

Ich habe es fast. Ich habe die request.session ausgedruckt und von Seite 1 gesehen, was ich bekomme. Alles sieht genau so aus, wie ich es brauche. Nur ich bin nicht sicher, wie man es in der zweiten Seite benutzt, um die user_id zu erhalten. Ich habe 'profile.user = first_page_data ['form_data_page_1']' versucht, aber es hat nicht funktioniert. Danke für all deine Hilfe. Ich bin neu und kämpfe. – Robby