【问题标题】:Django ManagementForm data is missing or has been tampered withDjango ManagementForm 数据丢失或被篡改
【发布时间】:2012-10-13 22:25:00
【问题描述】:

我不断收到错误:

[u'ManagementForm data is missing or has been tampered with']

我也不知道为什么。这是我的看法:

   def CreateWorkout(request):
    WorkoutInlineFormSet = inlineformset_factory(workout,exercise)
    if request.method == "POST" : 
        formset = WorkoutInlineFormSet(request.POST)

        if formset.is_valid(): 
            formset.save(); 
    else: 
        formset = WorkoutInlineFormSet()
    return render_to_response('submit.html',{'formset': formset},context_instance=RequestContext(request))

这是我的模板:

<body>
<form method="POST" action ="">
{{ formset.management_form }}
<table>
 {% for form in formset.forms %}
            {{ form }}
        {% endfor %}

        </table>
</form> 
</body>

我读到您必须包含formset.management_form,而我已经包含。我认为这很容易解决,但我一直无法找出问题所在。

【问题讨论】:

  • 您显示的模板是否正确?好像没有提交按钮。
  • 检查您的模板中的表单集名称是否有错字

标签: python django


【解决方案1】:

我遇到过这个问题。

原因是您的 POST 数据中没有类似 form-TOTAL_FORMS, form-INITIAL_FORMS and form-MAX_NUM_FORMS) 的内容。

您应该使用{{ formset.as_p }},这将呈现来自表单集的 management_form 数据。如果你想做自定义的formset渲染,不要忘记formset的management_form,让POST数据和mangement_form数据一起。

【讨论】:

    【解决方案2】:

    使用内联表单集时,需要提供对象相关的实例。

    # First, fetch the instance from the db
    workout = code_that_fetches_instance()
    
    if request.method == "POST" : 
        formset = WorkoutInlineFormSet(request.POST, instance=workout)
        ...
    else: 
        formset = WorkoutInlineFormSet(instance=workout)
    

    有关更多信息,请参阅 using an inline formset in a view 上的文档中的示例。

    如果workoutexercise 是您的模型,您应该遵循python 约定并将它们重命名为WorkoutExercise。小写的workout 应该是表单集中所有练习都链接到的实例。

    【讨论】:

    • 还是同样的错误。在 request.method == "POST" 下的 formset 声明期间发生错误
    • 进行更改后,您是否重新加载了代码并在再次提交之前提出了新的获取请求?当您使用我建议的更改发出获取请求时,请使用 html 输出更新您的问题。
    • 您没有包含我要求的 html 输出。我已经用更多建议更新了答案。
    • 您在获取请求以及提交表单时收到错误消息?完整的回溯可能会有所帮助。我认为你需要理清我提到的其他问题。今晚我不能再帮你了。希望你能成功。
    • 是锻炼和锻炼实例还是模型?我有同样的问题。 @Alasdair,带有相关对象的新模型实例的表单怎么样?
    【解决方案3】:

    改变这个:

      formset = WorkoutInlineFormSet(request.POST)
    

    到这里:

     formset = WorkoutInlineFormSet(request.POST or None, request.FILES or None)
    

    【讨论】:

      猜你喜欢
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 2014-10-09
      • 2022-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多