Django 1.9以两种页面形式使用django会话

时间:2016-09-19 14:46:28

标签: python django django-forms django-sessions django-1.9

如何使用Django会话让用户能够在一个页面上启动表单,然后转到下一页并让他们填写表单?

我已经研究过分页和向导形式,但我根本没有得到它们。

如果我有一个页面,其中一小部分模型我正在使用 - 在表单中 - 另一个页面与模型的其余部分 - forms.py与模型信息的其余部分 - 我可以使用首先形成完美。

但是当我转到下一页时,我收到一条错误(1048, "Column 'user_id' cannot be null")

我最好的猜测是使用Django会话来解决这个问题。我不希望用户必须再次输入他们的用户名和密码才能使用它。有什么想法吗?

my models / 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',)

的观点:

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}

1 个答案:

答案 0 :(得分:1)

我认为使用会话存储表单是一个好主意,因为您不希望每个页面将用户输入存储到数据库中,因为如果他/她在第3页中改变主意并且他/她想要放弃注册或其他任何内容?

我认为最好将表单存储在会话中,直到你进入最后一页,确保一切都有效,然后将数据保存在数据库中。

因此,让我们说波纹管代码位于将为第一个表单/页面提供服务的视图之一。您从POST请求中检索数据,并使用form.is_valid()检查给定数据是否有效,然后将form.cleaned_data(包含用户的验证数据)存储到会话变量中。

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

请注意,您可能需要添加代码以将用户重定向到下一页if form.is_valid()为真,如下所示:

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

然后在任何其他视图中,让我们在将要提供第二页的视图中说,您可以从第一页中检索来自第一页的数据,如下所示:

first_page_data = request.session['form_data_page_1']

你可以随心所欲地做任何事情,就像在第一个视图中执行form.is_valid()之后一样。