2016-09-19 91 views
2

如何使用Django会话让用户能够在一个页面上启动一个表单,并移动到下一页并让他们完成表单?Django 1.9以两种页面形式使用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} 

回答

1

我认为这是使用会话的存储形式,因为你不希望每个页面上做一个好主意将用户输入存储到数据库中,因为如果他/她在第三页中改变了主意并且他/她想要放弃注册或者它是什么?

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

因此,让我们假设下面的代码位于其中一个将用于第一个表单/页面的视图中。您从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')) 

然后在其他视图,让我们的观点说,会竭诚为您服务可以从第一页这样retreive的数据,从第二页:

first_page_data = request.session['form_data_page_1'] 

你可以做任何你想要与他们,如果它是你除权后在第一视图中执行form.is_valid()

+0

我会把这两个意见?我不知道如何从一个视图发送到另一个视图?我已经在上面添加了我的文件。谢谢! – Robby

+0

@Robby我已经更新了我的答案。 – Rafael

+0

我几乎拥有它。我打印出request.session并从第1页看到了我所得到的。这一切看起来完全像我所需要的。只有我不知道如何在第二页使用它来获取user_id。我试过'profile.user = first_page_data ['form_data_page_1']',但它没有奏效。谢谢你的帮助。我对此很陌生并且很挣扎。 – Robby