Python Django在表单上保存未完成的进度

Python Django在表单上保存未完成的进度,python,django,django-forms,Python,Django,Django Forms,我有一个django webapp,有多个用户登录并填写表单 一些用户可能开始填写表单,但缺少验证表单所需的一些数据(例如,在我们开始处理表单之前)。我希望他们能够填写表格,并有一个选项来保存部分信息(这样他们可以在另一天重新登录并完成),或提交完整的信息进行验证 目前我使用的所有表单都使用ModelForm,并且该模型具有确保有效数据的约束(例如,授权必须是唯一的)。但是,我希望他们能够在不进行任何验证的情况下保存此中间数据 我想到的解决方案似乎很不雅观,也很不可取:创建一个“保存部分表单”按

我有一个django webapp,有多个用户登录并填写表单

一些用户可能开始填写表单,但缺少验证表单所需的一些数据(例如,在我们开始处理表单之前)。我希望他们能够填写表格,并有一个选项来保存部分信息(这样他们可以在另一天重新登录并完成),或提交完整的信息进行验证

目前我使用的所有表单都使用ModelForm,并且该模型具有确保有效数据的约束(例如,授权必须是唯一的)。但是,我希望他们能够在不进行任何验证的情况下保存此中间数据

我想到的解决方案似乎很不雅观,也很不可取:创建一个“保存部分表单”按钮,保存POST dictionary,将其转换为文件,并创建一个“SavedPartialForm”模型,将用户连接到保存在工具架中的部分表单。这似乎合理吗?有没有更好的方法将日志直接保存到数据库中?或者是执行表单部分保存的附加模块(这似乎是webforms中相当常见的活动)


我对我的方法最大的担忧是,我希望最终能够在某种ajax/jquery方法中自动保存表单(比如每10分钟一次),而无需实际按下按钮并发送POST请求(例如,当触发自动保存时,用户不会被重定向出页面)。我对jquery不太熟悉,我想知道是否有可能做到这一点。

问题是您有多个表单

部分的。不完整。完成准备好了。准备好了

实际上,您在工作流的每个阶段都有一个表单

这根本没什么问题

  • 找出您在工作流中的位置

  • 填写并呈现下一阶段的表格

  • 表单可以相互继承以保存重复的验证方法。

    保存前:

    for field in form.fields:
        form.fields[field].required = False
    
    然后:


    将以下内容放入您的表格
    \uuuuu init\uuuu

    for field in form.fields:
        form.fields[field].required = False
    
    例如:

    class MySexyForm(Form):
        def __init__(self, *args, **kwargs):
            super(MySexyForm, self).__init__(*args, **kwargs)
            for field in self.fields:
                self.fields[field].required = False
    
    然后打电话:

    form = MySexyForm(...)
    form.save()
    
    但是,您需要确保您的
    clean()
    方法可以通过有条件地检查已清理的数据中是否存在缺少的属性来处理这些属性。例如,如果另一个表单字段验证依赖于
    customer\u id
    ,但您的部分表单未指定,则
    customer\u id
    将不在已清理的\u数据中

    如果这是一个模型表单,您可以检查该值是否在
    cleaned_data
    中,并返回到
    instance.field
    ,例如,如果缺少该值

    def clean(self):
        inst = self.instance
        customer_id_new = self.cleaned_data.get('customer_id', None)
        customer_id_old = getattr(self.instance, 'customer_id') if inst else None
        customer_id = customer_id_new if customer_id_new else customer_id_old
    
    请记住,新值的格式几乎肯定不会与旧值相同,例如
    customer\u id
    实际上可能是模型实例上的
    RelatedField
    ,但表单数据上的pk
    int
    。同样,您需要在clean中处理这些类型差异


    这是Django表单真正缺乏的一个领域。

    谢谢。这是很有帮助的,也是一种很好的看待它的方式。我仍然怀疑这是否与每隔十分钟左右自动保存部分/不完整表单以及某种jQuery代码不兼容。@jimbob:永远不会。关键是要有一个与工作流的当前阶段相匹配的表单。如果他们不能为其工作流阶段填写适当的数据,则该表单无效。如果他们在这一阶段填写了足够的内容,那么表格是有效的。如果他们想填写更多的内容,你必须一步一步地浏览相关表格,直到你赶上他们输入的内容。你能让这个工作正常吗?你能提供一个如何做的详细答案吗。这将对其他开发人员非常有用。通过尝试此解决方案,我得到了一个验证错误,“
    表单无法创建,因为数据未验证。
    ”知道任何解决方案吗?
    def clean(self):
        inst = self.instance
        customer_id_new = self.cleaned_data.get('customer_id', None)
        customer_id_old = getattr(self.instance, 'customer_id') if inst else None
        customer_id = customer_id_new if customer_id_new else customer_id_old