我有一个django webapp,其中有多个用户登录并填写表单。
有些用户可能会开始填写表单并缺少验证表单所需的一些必需数据(例如,授权#)(在我们开始处理之前)。我希望他们能够填写表格并选择保存部分信息(这样他们可以重新登录并完成它的另一天)或提交正在进行验证的完整信息。
目前我正在为我使用的所有表单使用ModelForm,并且模型具有确保有效数据的约束(例如,授权#必须是唯一的)。但是,我希望他们能够保存这些中间数据,而无需进行任何验证。
我认为的解决方案看起来相当不优雅且非常大:创建一个“保存部分表单”按钮,保存POST字典将其转换为shelf文件并创建“SavedPartialForm”模型将用户连接到保存在工具架中的部分表单。这看起来合情合理吗?有没有更好的方法将POST dict直接保存到db?或者是一个附加模块,它可以对表单进行部分保存(这似乎是与webforms相当常见的活动)?
我对我的方法的最大担心是我希望最终能够在一些ajax / jquery方法中自动执行此表单 - 自动保存(比如说每10分钟),而不是实际按下按钮并发送POST请求(例如,所以触发自动保存时,用户不会从页面重定向)。我对jquery并不熟悉,我想知道是否可以这样做。
答案 0 :(得分:8)
Pro Django by Marty Alchin有一个很好的解决方案。简而言之,您创建了另一个包含表单哈希,表单字段和保存值的模型。恢复时,你只需根据它的哈希值加载表单。
答案 1 :(得分:3)
:
for field in form.fields:
form.fields[field].required = False
然后:
form.save()
答案 2 :(得分:1)
问题在于您有多个表单。
部分。不完整的。完成。准备好了。准备好了。
实际上,您有一个工作流程的每阶段表单。
这根本没有错。
找出工作流程中的位置。
填写并呈现下一阶段的表格。
表单可以相互继承以保存重复的验证方法。
答案 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真正缺乏的一个领域。