Django表单 - 在模板中调用is_valid()

时间:2014-11-19 11:50:53

标签: django forms validation

我正在使用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
})

更新:

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

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

  2. 存在依赖关系:driver_form是模型表单,car_form_set是基于driver_form正在添加的实例的内联表单集。

  3. 问题确实在视图中,因为 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
    })
    

1 个答案:

答案 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 %}