2011-02-11 72 views
13

我想創建一個表單,一旦提交,表單的每個下一個表單對於同一個用戶而言,表單將已經填寫上一次的數據用戶提交了它。聽起來像django應該有捷徑 - 是否有它?如果不是,最簡單的方法是什麼?Django:使用cookie保存並恢復表單的狀態

我能想到的最好的方法是挑cleaned_data並將其保存爲cookie,以後再重新創建表單。

回答

19

這聽起來像一個很好的計劃。但是,如果使用cookie沒有任何壓力,我會訴諸使用會話。這樣你就不會達到cookie的大小限制,並且傳輸更大尺寸的cookie會減慢響應時間。

form = MyForm(initial=request.session.get('form_data')) 
... 
if form.is_valid(): 
    request.session['form_data'] = form.cleaned_data 
+0

如果您需要再次確認恢復形式出於某種原因,做 `form = MyForm(request.session.get('form_data')`。 使用首字母可以使表單無界,form.is_valid()總是返回False,即使沒有錯誤。綁定到數據以便使用'is_valid()'方法。 – javed 2016-08-09 12:42:31

1

進行了擴展,這一點,這裏是一個辦法,我已經找到了使用會話表單數據與基於類的視圖保存:

from django.views.generic.edit import FormView 

class MyFormView(FormView): 
    template_name = 'myform.html' 
    form_class = MyForm 
    success_url = '/success/' 

    def get_form_kwargs(self): 
     """ 
     The FormMixin uses this to populate the data from the POST request. 
     Here, first try to populate it from the session data, if any; 
     if there is POST data, it should override the session data. 
     """ 
     kwargs = {'data': self.request.session.get('form_data', None)} 
     kwargs.update(super(MyFormView, self).get_form_kwargs()) 
     return kwargs 

    def form_valid(self, form): 
     ... 
     # save the form data to the session so it comes up as default next time 
     self.request.session['form_data'] = form.cleaned_data 
     ...