在没有 POST 的情况下对内联表单集使用 django 表单验证
Using django form validation for inlineformset without a POST
在我的 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 ...
现在我需要对内联表单集执行相同的操作。每个文档可以有 1 个或多个项目,我使用内联表单集进行依赖于文档字段和项目字段的跨字段验证。我有这个:
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'。
如果我的问题不是直截了当,我深表歉意,但我确实找到了前进的方向,并且会 post 在这里以防其他人发现它有帮助。
基本上,据我所知,是的,我确实需要手动重建字典字段以传递给 ItemFormSet 构造函数,以创建管理表单数据。鉴于我想测试验证的单个 '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()
在我的 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 ...
现在我需要对内联表单集执行相同的操作。每个文档可以有 1 个或多个项目,我使用内联表单集进行依赖于文档字段和项目字段的跨字段验证。我有这个:
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'。
如果我的问题不是直截了当,我深表歉意,但我确实找到了前进的方向,并且会 post 在这里以防其他人发现它有帮助。
基本上,据我所知,是的,我确实需要手动重建字典字段以传递给 ItemFormSet 构造函数,以创建管理表单数据。鉴于我想测试验证的单个 '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()