我目前正在运行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让这个过去?它应该丢掉额外的形式,因为没有任何变化。
答案 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)
...
将此变通方法整合到表单/表单本身而不是视图中肯定会更好,但我不经常需要这种行为,所以它对我来说已经足够好了。