【问题标题】:Using django form validation for inlineformset without a POST在没有 POST 的情况下对 inlineformset 使用 django 表单验证
【发布时间】:2016-09-20 15:00:41
【问题描述】:

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

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

现在我需要对内联表单集执行相同的操作。每个 Document 可以有 1 个或多个 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'。

【问题讨论】:

    标签: django forms validation inline-formset


    【解决方案1】:

    如果我的问题不直截了当,我深表歉意,但我确实找到了前进的方向,并将在此处发布以防其他人发现它有帮助。

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

    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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-31
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多