我正在使用Django 1.5。我有一个包含多种形式的模板:一个驱动程序有许多汽车(内联表单)。我想显示一个提示,指出哪个部分包含错误。
模板:
{% if driver_form.is_bound and not driver_form.is_valid %}
Please correct errors in the Driver Data.
{% endif %}
{% if car_form.is_bound and not car_form.is_valid %}
Please correct errors in the Car Data.
{% endif %}
问题是如果第一个表单无效,第二个表单也会弹出,即使第二个表单有效。我还注意到,如果我将{{ car_form.is_valid }}
连续三次,第一次为空,下一次(及之后)为True
。
原始观点:
if request.method == 'POST':
driver_form = DriverModelForm(request.POST)
car_form_set = CarInlineFormSet(request.POST) # wrong: no instance passed
if driver_form.is_valid():
driver = driver_form.save(commit=False)
car_form_set = CarInlineFormSet(request.POST, instance=driver)
if car_form_set.is_valid():
driver.save()
car_form_set.save()
else:
driver_form = DriverModelForm()
car_form_set = CarInlineFormset()
return render(request, 'template.html', {
'driver_form': driver_form,
'car_form_set': car_form_set
})
更新:
为了简单起见,我似乎忽略了实际导致问题的细节。经验教训。
页面加载时有一个Javascript设置值,而只需要在下拉列表更改时完成。它隐藏了错误的值并导致表格下次有效。
存在依赖关系:driver_form
是模型表单,car_form_set
是基于driver_form
正在添加的实例的内联表单集。
问题确实在视图中,因为 seddonym 建议:如果car_form_set
无效,则driver_form
未使用实例进行初始化。因此is_valid()
既不是True
也不是False
。结论:在模板中使用is_valid()
可以正常工作。
固定视图:
driver = Driver()
if request.method == 'POST':
driver_form = DriverModelForm(request.POST, instance=driver)
if driver_form.is_valid():
driver = driver_form.save(commit=False)
car_form_set = CarInlineFormSet(request.POST, instance=driver)
if car_form_set.is_valid():
driver.save()
car_form_set.save()
else:
driver_form = DriverModelForm(instance=driver)
car_form_set = CarInlineFormset(instance=driver)
return render(request, 'template.html', {
'driver_form': driver_form,
'car_form_set': car_form_set
})
答案 0 :(得分:2)
您不需要调用已经由视图调用过的form.is_valid。而是检查错误:
{% if first_form.errors %}
Please correct errors in the First Form.
{% endif %}
{% if second_form.errors %}
Please correct errors in the Second Form.
{% endif %}