Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django表单调用在模板中是有效的()_Django_Forms_Validation - Fatal编程技术网

Django表单调用在模板中是有效的()

Django表单调用在模板中是有效的(),django,forms,validation,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

我正在使用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\u form.is\u valid}}
连续放置三次,第一次它是空的,下一次(以及接下来)它是
真的

原始观点:

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\u form
    是一个模型表单,
    car\u form\u set
    是一个基于
    driver\u form
    正在添加的实例的内联表单集

  • 正如seddonym所建议的那样,问题确实在视图中:如果
    驾驶员表单
    无效,则
    汽车表单集
    没有使用实例初始化。所以
    是有效的()
    既不是
    真的
    也不是
    假的
    。结论:在模板中使用
    是有效的()

    固定视图:

    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
    })
    

    您不需要调用form.is_,它将已经被视图调用。相反,请检查错误:

    {% if first_form.errors %}
        Please correct errors in the First Form.
    {% endif %}
    {% if second_form.errors %}
        Please correct errors in the Second Form.
    {% endif %}
    

    在模板中做这样的事情不是个好主意。顺便说一句,当您呈现模板时,它将使用旧数据,而不是用户提交的数据。@Rohan为什么要使用旧数据?如果使用函数视图,您需要隐式调用.is_valid()。这是真的,我假设code_刺客正确实现了视图@code_刺客,如果这不起作用,请随时使用您正在使用的视图更新您的答案。声明窗体在您第一次调用
    is_valid()
    或access
    errors
    时被验证,并且只发生一次,因此应该没有区别。