python - Django 1.9 在两个页面形式中使用 django session

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

我如何使用 Django session 让用户能够在一页上开始一个表单,然后移动到下一页并让他们完成表单?

我研究过分页和向导形式,但我根本不了解它们。

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

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

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

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

最佳答案

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

我认为最好将表单存储在 session 中,直到进入最后一页,确保所有内容都有效,然后将数据保存在数据库中。

所以假设下面的代码位于将服务于第一个表单/页面的 View 之一中。您从 POST 请求中检索数据并使用 form.is_valid() 检查给定数据是否有效,然后存储 form.cleaned_data(其中包含用户的验证数据)到 session 变量。

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

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

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

然后在任何其他 View 中,假设在要为第二页提供服务的 View 中,您可以像这样从第一页检索数据:

first_page_data = request.session['form_data_page_1']

你可以用它们做任何你想做的事,就像在第一个 View 中执行了 form.is_valid() 之后一样。

关于python - Django 1.9 在两个页面形式中使用 django session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39576016/

相关文章:

python - 如何阻止matplotlib GUI线程卡住?

python - 在使用从列表中计算出最接近数字的代码时遇到问题

django - 将 Django 服务器发送的事件与数据库后保存一起使用

python - ModelForm 字段的初始值不起作用

python - 使用 python 使用 Active Directory 密码连接 Azure SQL Server 数据库(出现错误)

python 按特定顺序删除重复项(不是 `first` , `last` )

html - django 静态文件在运行时不会更新

javascript - 使用 Django 的 jQuery/JavaScript 弹出窗口(从子项中选择,在父项中显示)

python - 呈现 : 'BoundField' object is not iterable 时捕获类型错误

django - 如何从表单构造函数动态更新Django Form Meta类字段?