Django在表格上保存不完整的进展

时间:2010-11-12 19:43:45

标签: python django django-forms

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

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

目前我正在为我使用的所有表单使用ModelForm,并且模型具有确保有效数据的约束(例如,授权#必须是唯一的)。但是,我希望他们能够保存这些中间数据,而无需进行任何验证。

我认为的解决方案看起来相当不优雅且非常大:创建一个“保存部分表单”按钮,保存POST字典将其转换为shelf文件并创建“SavedPartialForm”模型将用户连接到保存在工具架中的部分表单。这看起来合情合理吗?有没有更好的方法将POST dict直接保存到db?或者是一个附加模块,它可以对表单进行部分保存(这似乎是与webforms相当常见的活动)?

我对我的方法的最大担心是我希望最终能够在一些ajax / jquery方法中自动执行此表单 - 自动保存(比如说每10分钟),而不是实际按下按钮并发送POST请求(例如,所以触发自动保存时,用户不会从页面重定向)。我对jquery并不熟悉,我想知道是否可以这样做。

4 个答案:

答案 0 :(得分:8)

Pro Django by Marty Alchin有一个很好的解决方案。简而言之,您创建了另一个包含表单哈希,表单字段和保存值的模型。恢复时,你只需根据它的哈希值加载表单。

答案 1 :(得分:3)

保存前

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

然后:

form.save()

答案 2 :(得分:1)

问题在于您有多个表单。

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

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

这根本没有错。

  1. 找出工作流程中的位置。

  2. 填写并呈现下一阶段的表格。

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

答案 3 :(得分:1)

将以下内容放入表单__init__

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()方法可以通过有条件地检查clean_data中是否存在任何缺失属性来处理这些属性。例如,如果另一个表单字段验证依赖于customer_id但您的部分表单尚未指定,则customer_id将不在clean_data中。

如果这是针对模型表单,您可以检查该值是否在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_id实际上可能是模型实例上的RelatedField,但是pk {{1}在表单数据上。同样,您需要在清洁中处理这些类型差异。

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