【问题标题】:Django 1.9 using django sessions in two page formsDjango 1.9 以两种页面形式使用 django 会话
【发布时间】:2017-01-27 07:28:09
【问题描述】:

如何使用 Django 会话让用户能够在一个页面上启动表单,然后移至下一页并让他们完成表单?

我研究过分页和向导表单,但我根本没有得到它们。

当我有一个页面包含我正在使用的模型的一小部分 - 在表单中 - 另一个页面包含模型的其余部分 - forms.py 包含模型信息的其余部分 - 我可以使用第一个表单完美。

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

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

我的模型/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}

【问题讨论】:

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


    【解决方案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() 之后一样。

    【讨论】:

    • 我会在两个视图中都放这个吗?我不确定如何将它从一个视图发送到另一个视图?我已经在上面添加了我的文件。谢谢!
    • 我几乎拥有它。我已经打印出 request.session 并从第 1 页看到我得到了什么。这一切看起来和我需要的完全一样。只有我不确定如何在第二页中使用它来获取 user_id。我试过profile.user = first_page_data['form_data_page_1'],但没用。谢谢你的帮助。我是新手,正在苦苦挣扎。
    • 我明白了。这是一件作品。但你完全帮助了!
    • @Robby 很高兴我帮助你弄清楚了自己,我认为给出提示而不是解决方案总是更好,因为自己找到解决方案更令人兴奋,并且会让你保持对自己的动力做。
    猜你喜欢
    • 2017-05-25
    • 2011-09-28
    • 1970-01-01
    • 2011-01-23
    • 2014-10-29
    • 2016-06-07
    • 1970-01-01
    • 2013-08-25
    • 2023-01-30
    相关资源
    最近更新 更多