【问题标题】:Django "ManagementForm data missing" when rendering 2 formsets with foreignkey使用外键渲染 2 个表单集时,Django “ManagementForm 数据丢失”
【发布时间】:2013-08-04 08:41:33
【问题描述】:

我正在尝试在 1 个视图中呈现 2 个表单集并得到一个

u'ManagementForm data is missing or has been tampered with

错误。网页呈现正常,当我点击提交时数据确实将值传递给数据库,但我认为我传递管理表单数据不正确。

我还想补充一点,我使用了“https://docs.djangoproject.com/en/dev/topics/forms/formsets/”,但它没有提供足够的文档来传递管理表单数据。此外,我的选项和结果表单集具有相同的外键。如果您在传递管理表单数据时发现任何问题,或者代码是否有其他问题,请告诉我。

下面是我的views.py和html:

views.py

def option(request):

if request.method == "POST":

   optionForm = OptionForm(request.POST)
   outcomeForm = OutcomeForm(request.POST)

   if optionForm.is_valid():
      new_option = optionForm.save()
      new_outcome = outcomeForm.save()
      optionInlineFormSet = OptionFormSet(request.POST, request.FILES, instance=new_option, prefix='option')
      outcomeInlineFormSet = OutcomeFormSet(request.POST, request.FILES, instance=new_outcome, prefix='outcome')

      if optionInlineFormSet.is_valid() and outcomeInlineFormSet.is_valid:
         optionInlineFormSet.save()
         outcomeInlineForSet.save()
         return HttpResponseRedirect(reverse(outcome))

else:
   optionForm = OptionForm()
   outcomeForm = OutcomeForm()
   optionInlineFormSet = OptionFormSet()
   outcomeInlineFormSet = OutcomeFormSet()
return render_to_response("option.html", {'optionForm': optionForm, 'outcomeForm': outcomeForm, 'optionInlineFormSet': optionInlineFormSet, 'outcomeInlineFormSet': outcomeInlineFormSet}, context_instance=RequestContext(request))

html:

<form class="option_form" action="{% url option %}" method="post">{% csrf_token %}

{{ optionInlineFormSet.management_form }}
{{ outcomeInlineFormSet.management_form }}
{{ optionForm.as_table }}
{{ outcomeForm.as_table}}

<input type="submit" name="submit" value="Submit" class="button">
</form>

【问题讨论】:

    标签: html django rendering formsets


    【解决方案1】:

    找到了答案。您需要为 InlineFormsets 添加前缀,以免它们相互冲突。这是我的更改:

    else:
       optionForm = OptionForm()
       outcomeForm = OutcomeForm()
       optionInlineFormSet = OptionFormSet(prefix='option')
       outcomeInlineFormSet = OutcomeFormSet(prefix='outcome')
    

    【讨论】:

    • 当使用多个表单或表单集时,最好为所有表单(或除一个之外的所有表单)添加前缀,以防出现任何冲突的字段名称。 FormSet 有点特殊,因为当您不使用前缀时,它们的名称总是会发生冲突。
    • 名称到底有什么冲突?例如,在上面的代码中,我的表单集被命名为 OptionFormset 和 OutcomeFormset。我认为它们不会相互冲突。
    • 表单或表单集中的每个字段在 html 代码中都有一个唯一的名称。这会告诉您的 Form 或 FormSet 从何处获取正确字段的正确数据。如果两个字段获得相同的 html 名称,则 Form 或 FormSet 不知道从哪里获取数据。在 FormSet 的情况下,它总是为初始表单计数和总表单计数定义相同的名称,因此如果没有前缀,两个 FormSet 总是会发生冲突。如果您养成了始终使用两个或多个形式的前缀的习惯,那么当您不小心将两个字段命名为相同的名称时,您就可以省去大量调试的麻烦。
    猜你喜欢
    • 2011-07-08
    • 2013-08-04
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    相关资源
    最近更新 更多