使用FormWizard在完成整个过程之前保存表单数据?
我在我的应用程序中使用FormWizard来完成一系列操作。我有两个模型:员工(Employee)和人(Person),员工类是从人类继承而来的,所以员工对象可以使用人类的所有字段。
现在我正在使用FormWizard创建一组表单。我想知道,如果一个用户开始填写表单,填了4个表单中的2个,然后想在之后再填写剩下的表单,这样是否可以将他填写的两个表单的数据保存到数据库中?
下次他再来时,可以从第三个表单继续填写。有没有人知道这个怎么做?如果能帮我,那真是太好了。谢谢!
1 个回答
2
你可以在每一步的时候,把表单的状态保存到一个序列化的对象里,这个对象在数据库中和用户是有关系的。
然后在连接表单向导的时候,把表单向导的视图包裹在一个自定义的视图里,这个视图会检查用户是否有保存的表单,如果有的话,就把它反序列化并重定向到相应的步骤。
补充:看起来表单向导会把状态保存在POST请求中,所以只需要保存POST数据。
models.py:
class SavedForm(Model):
user = ForeignKey(User)
postdata = TextField()
views.py:
import pickle
class MyWizard(FormWizard):
def done(self, request, form_list):
SavedForm.objects.get(user=request.user).delete() # clear state!!
return render_to_response('done.html',)
formwizard = MyWizard([Form1, Form2]) <- class name, not instance name
def formwizard_proxy(request, step):
if not request.POST: #if first visit, get stored data
try:
prev_data = SavedForm.objects.get(user=request.user)
request.POST = pickle.loads(prev_data.postdata)
except:
pass
else: # otherwise save statet:
try:
data = SavedForm.objects.get(user=request.user)
except:
data = SavedForm(user=request.user)
data.postdata=pickle.dumps(request.POST)
data.save()
return formwizard(request)
补充:修改了表单向导的构造函数