Django 1.9 在两个页面形式中使用 django 会话
Django 1.9 using django sessions in two page forms
我如何使用 Django 会话让用户能够在一页上开始一个表单,然后移动到下一页并让他们完成表单?
我研究过分页和向导表单,但我根本不了解它们。
当我有一个页面包含我正在使用的模型的一小部分时 - 在表单中 - 另一个页面包含模型的其余部分 - forms.py
包含模型信息的其余部分 - 我可以完美使用第一种形式。
但是当我移至下一页时,我收到一条错误消息 (1048, "Column 'user_id' cannot be null")
。
我最好的猜测是使用 Django 会话来解决这个问题。我不希望用户必须再次输入用户名和密码才能使其正常工作。有什么想法吗?
我的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}
我认为使用会话来存储表单是个好主意,因为您不希望在每个页面上都将用户输入存储到数据库中,因为如果 s/he 在第 3 页改变主意并且s/he 想要放弃注册或其他任何内容?
我认为最好将表单存储在会话中,直到进入最后一页,确保所有内容都有效,然后将数据保存在数据库中。
所以假设下面的代码位于将服务于第一个 form/page 的视图之一中。您从 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()
之后一样。
我如何使用 Django 会话让用户能够在一页上开始一个表单,然后移动到下一页并让他们完成表单?
我研究过分页和向导表单,但我根本不了解它们。
当我有一个页面包含我正在使用的模型的一小部分时 - 在表单中 - 另一个页面包含模型的其余部分 - forms.py
包含模型信息的其余部分 - 我可以完美使用第一种形式。
但是当我移至下一页时,我收到一条错误消息 (1048, "Column 'user_id' cannot be null")
。
我最好的猜测是使用 Django 会话来解决这个问题。我不希望用户必须再次输入用户名和密码才能使其正常工作。有什么想法吗?
我的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}
我认为使用会话来存储表单是个好主意,因为您不希望在每个页面上都将用户输入存储到数据库中,因为如果 s/he 在第 3 页改变主意并且s/he 想要放弃注册或其他任何内容?
我认为最好将表单存储在会话中,直到进入最后一页,确保所有内容都有效,然后将数据保存在数据库中。
所以假设下面的代码位于将服务于第一个 form/page 的视图之一中。您从 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()
之后一样。