使用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) ... 将此变通方法集成到表单/表单集本身,而不是视图中肯定会更好,但我不经常需要这种行为,因此对我来说这已经足够了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |