加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 13:39:16 所属栏目:Python 来源:网络整理
导读:我目前正在运行Django 1.4. 当我创建一个modelformset并为额外的表单提供初始值时,Django然后对它运行验证并发现其他必需字段为空,因此抛出验证错误. 我的代码看起来像这样: QueryFormset = modelformset_factory(Query,extra=1,can_delete=True,form=Query
我目前正在运行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让这个过去?它应该丢掉额外的形式,因为没有任何改变.

解决方法

我不是说这是最好的解决方案,但我能够通过修改表单的’ 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)

...

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读