【发布时间】:2014-11-19 11:50:53
【问题描述】:
我正在使用 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 %}
问题在于,如果第一个表单无效,即使第二个表单有效,也会弹出第二个消息。我还注意到,如果我连续输入 3 次 {{ 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 所建议的那样:如果 driver_form 无效,则不会使用实例初始化 car_form_set。所以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
})
【问题讨论】:
-
在模板中做这样的事情不是好主意。顺便说一句,当您渲染模板时,它将使用旧数据而不是用户提交的数据。
-
@Rohan 为什么要使用旧数据?
标签: django forms validation