使用modelformset_factory中的初始数据触发Django验证错误

时间:2014-01-02 19:14:58

标签: django validation django-forms

我目前正在运行Django 1.4。

当我创建一个modelformset并为额外的表单提供一个初始值时,Django会对它进行验证并发现其他必填字段为空,因此会抛出验证错误。

我的代码看起来像这样:

QueryFormset = modelformset_factory(Query, extra=1, 
    can_delete=True, form=QueryForm
)

if request.method == "POST":
    qformset = QueryFormset(request.POST)
    if qformset.is_valid():
        qformset.save()
    else:
        # This is where we go when the formset is saved without
        # any values inserted into the extra form
else:
    qformset = QueryFormset(
        queryset=Query.objects.filter(user=request.user),
        initial=[{'user': request.user}]
    )

如果我只是点击保存而不对表单的值(现有表单或额外表单)进行任何更改,则表单集被标记为无效,因为额外表单在用户字段中有某些内容,但是缺少其他表单必填项目。

如何让Django让这个过去?它应该丢掉额外的形式,因为没有任何变化。

1 个答案:

答案 0 :(得分:1)

我并不是说这是最好的解决方案,但我能够通过修改表格' is_bound'来解决这个问题。属性。这是一个内部标志,表明表单是否有值得验证的东西(据我所知)。

initial_data = [{...},]
if request.POST:
    formset = ContactFormSet(request.POST, initial=initial_data)

    valid = True
    for form in formset:
        if not form.has_changed():
            # we don't want to complain about an unmodified form.
            form.is_bound = False
        if not form.is_valid():
            valid = False

    if valid:
        for form in formset:
            if form.has_changed():
                # do stuff

else:
    formset = ContactFormSet(initial=initial_data)

...

将此变通方法整合到表单/表单本身而不是视图中肯定会更好,但我不经常需要这种行为,所以它对我来说已经足够好了。