在没有POST的情况下对inlineformset使用django表单验证

时间:2016-05-23 16:19:04

标签: django forms validation inline-formset

在我的django应用程序中,用户可以通过以下方式创建文档模型对象:1)将数据输入表单或2)复制现有文档。在第二种情况下,我想使用is_valid来确认现有Document仍然有效(有效性规则自创建以来可能已更改)。我有这样的工作:

doc = original_doc.clone()
form = DocumentForm(data=doc.__dict__, instance = doc)
if form.is_valid():
    # doc is valid
else:
    ... do stuff ... 

现在我需要为inlineformset做同样的事情。每个Document可以有一个或多个Item,我使用内联formset进行跨域验证,这取决于Document字段和Item字段。我有这个:

ItemFormSet = inlineformset_factory(Document, 
              Item, form=ItemForm, formset=CustomItemFormSet)
item_formset = ItemFormSet(data= XXX, instance = doc, 
               queryset=doc.item_set, doc_form=form)
if item_formset.is_valid():
    # item_formset is valid
else:
    ... do stuff...

我的问题是:如何在ItemFormSet调用中获取数据参数(XXX)的值?当我向用户显示表单时,我可以使用request.POST。没有它,我是否需要按字段手动重建字典?由于表单集前置于字段名称的数据,它变得复杂,例如:'id_item_set-0-field_name'。

1 个答案:

答案 0 :(得分:0)

如果我的问题不是直截了当,我很抱歉,但我确实找到了前进的方法,并会发布在此以防其他人认为有用。

基本上,据我所知,YES,我确实需要手动重建字典字段以传递给ItemFormSet构造函数,以创建管理表单数据。鉴于我想测试验证的单个'item'变量,我创建了一个包含item的字段的字典,然后添加了管理表单数据:

item_dict = item.__dict__
item_dict_itemset = {}
for key, value in item_dict.iteritems():
    item_dict_itemset["item_set-0-{}".format(key)] = value
item_dict_itemset["item_set-INITIAL_FORMS"] = 0
item_dict_itemset["item_set-MIN_NUM_FORMS"] = 0
item_dict_itemset["item_set-MAX_NUM_FORMS"] = 1000
item_dict_itemset["item_set-TOTAL_FORMS"] = 1

item_formset = ItemFormSet(data-item_dict_itemset, instance=doc, queryset=doc.item_set)
formset_is_valid = item_formset.is_valid()