【问题标题】:Django: [u'ManagementForm data is missing or has been tampered with']Django:[u'ManagementForm 数据丢失或被篡改']
【发布时间】:2015-05-27 22:50:08
【问题描述】:

我有一个要保存到模型的模型表单集。

在我的模板中,以下内容完美运行(意味着当我点击提交时表单会保存到数据库中):

{{ formset.management_form }}
{{ formset }}

即使这样也很好用:

{{ formset.management_form }}
{% for row in formset %}
    {{ row }}
{% endfor %}

但只要我想像这样设置我的表单集(在表格中):

{{ formset.management_form }}
{% for row in formset %}
    {{ row.field1 }}
    {{ row.field2 }}
    {{ row.field3 }}
{% endfor %}

我得到 [u'ManagementForm 数据丢失或已被篡改']。

字段 1 到 3 与我要保存到的模型完全对应。我实在想不通!

我的回溯显示:

GET    No GET data
POST   Variable              Value
       form-0-field1         u'3'
       form-0-field2         u'3'
       form-0-field3         u'3'

这与我在前两个示例中使用的值相同(并且正确保存)。

【问题讨论】:

    标签: django modelform formset


    【解决方案1】:

    您的表单呈现不包括 ManagementForm 所需的其他数据(form-TOTAL_FORMSform-INITIAL_FORMSform-MAX_NUM_FORMS

    见:https://docs.djangoproject.com/en/1.7/topics/forms/formsets/#understanding-the-managementform

    【讨论】:

    • 感谢@Railslide 的回复。我不确定为什么这会在前两个示例中起作用,但不适用于第三个示例?我还通过排除最后一个 {{ row.field3 }} 进行了测试,它可以工作,除了 field3 是必需的。
    • 在上一个示例中,您在表单的特定字段上呈现,并且由于您可能不会在其他任何地方添加额外数据,因此表单集未通过验证。在另外两个示例中,您将渲染表单集和单行/表单的任务委托给 django,因此它负责在幕后添加额外数据
    【解决方案2】:

    我终于找到了答案(在文档中),它恰巧地解释了这个问题,就像我问我的问题一样。第三个选项必须渲染 {{ row.id }},否则 Django 将创建验证错误。用户可以在内联 html 中使用 'style="display: none;"',但它必须被渲染。

    这是链接: https://docs.djangoproject.com/en/1.7/topics/forms/modelforms/#using-the-formset-in-the-template

    经过测试,它可以工作!

    【讨论】:

      猜你喜欢
      • 2014-12-28
      • 2016-02-08
      • 2016-06-24
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多