2016-09-19 10 views
2

Djangoセッションを使用して1つのページでフォームを開始し、次のページに移動してフォームを完成させるにはどうすればよいですか?Django 1.9 2つのページフォームで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

私はそれはあなたが各ページにしたくないので、フォームを保存するためにセッションを使用することをお勧めだと思います3番目のページで気が変わり、登録を破棄したい場合や、それが何であれ、何を削除するのか

最後のページに入るまで、フォームをセッションに保存することをお勧めします。すべてが有効であることを確認してから、データをデータベースに保存してください。

だから、蛇口コードが最初のフォーム/ページを表示するビューの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')) 

そして、他のビュー内のビューに言わせていますあなたはこのような最初のページからのデータから盗んことができ、2ページ目の役割を果たすために起こっている:

first_page_data = request.session['form_data_page_1'] 

をそして、それはあなたの元の後だったかのように、あなたが彼らと一緒にやりたいことができます最初のビューでform.is_valid()を入力してください。

+0

私はこれを両方のビューに入れますか?あるビューから別のビューに送信する方法がわかりません。上記のファイルを追加しました。ありがとうございました! – Robby

+0

@Robby私は自分の答えを更新しました。 – Rafael

+0

私はほとんどそれを持っています。 Iveはrequest.sessionを印刷し、1ページ目から私が得ているものを見てきました。それはまさに私が必要とするもののように見えます。 user_idを取得するために2番目のページでそれを使用する方法がわかりません。私は 'profile.user = first_page_data ['form_data_page_1']'を試しましたが、動作しませんでした。ご協力いただきありがとうございます。私はこれが初めてで、苦労しています。 – Robby

関連する問題