【问题标题】:Django form - Calling is_valid() in a templateDjango 表单 - 在模板中调用 is_valid()
【发布时间】: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
})

更新:

似乎为了简单起见,我忽略了实际导致问题的细节。经验教训。

  1. 页面加载时有一个 Javascript 设置值,而它只需要在下拉更改时完成。它隐藏了错误的值并导致表单在下一次有效。

  2. 有一个依赖: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


【解决方案1】:

您不需要调用 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 %}

【讨论】:

  • 如果使用函数视图,您需要自己隐式调用 .is_valid()。
  • 是的,我假设 code_assassin 正确地实现了视图。 @code_assassin,如果这不起作用,请随时使用您正在使用的视图更新您的答案。
  • Django documentation 声明表单在您第一次调用is_valid() 或访问errors 时进行验证,并且只发生一次,因此应该没有区别。
猜你喜欢
  • 2011-07-02
  • 2012-06-19
  • 2017-04-18
  • 2020-11-23
  • 1970-01-01
  • 2017-04-30
  • 2016-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多