使用FormWizard在完成整个过程之前保存表单数据?

1 投票
1 回答
945 浏览
提问于 2025-04-16 08:07

我在我的应用程序中使用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)

补充:修改了表单向导的构造函数

撰写回答