【问题标题】:Django validation error triggered with initial data in modelformset_factorymodelformset_factory 中的初始数据触发了 Django 验证错误
【发布时间】:2014-01-20 07:45:23
【问题描述】:

我目前正在运行 Django 1.4。

当我创建一个模型表单集并为额外表单提供初始值时,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 让它过去?它应该丢弃多余的表单,因为没有任何更改。

【问题讨论】:

  • 你有没有想过这个问题?我也有同样的问题。

标签: django validation django-forms


【解决方案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)

...

将这种解决方法集成到表单/表单集本身而不是视图中肯定会更好,但我并不经常需要这种行为,所以对我来说已经足够了。

【讨论】:

  • 这似乎是一个不错的解决方案,老实说,我写这个已经很久了,有问题的代码根本不存在了。
  • @lightstrike 是的,我看到这是一个老问题,但我遇到了类似的问题,所以我想我会为任何未来的谷歌员工发布我的解决方案。
猜你喜欢
  • 1970-01-01
  • 2018-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
相关资源
最近更新 更多