【问题标题】:Two modelformset in one view in djangodjango 中的一个视图中的两个模型集
【发布时间】:2021-02-26 08:28:55
【问题描述】:

我是 django 新手,我试图在一个视图中拥有两个模型表单集,但我收到“ManagementForm 数据丢失或已被篡改”错误。我已经检查了docs,我知道我必须使用 management_formset 标记和前缀,但我仍然遇到错误。

我一直在寻找答案,但无法修复错误。

只有一个表单集,一切都按预期工作。

Views.py

def soil_page(request):
    SoilFormSet = modelformset_factory(model=Soil,exclude=False,min_num=1,extra=0)
    CMCFormSet = modelformset_factory(model=CMC,exclude=False,max_num=1)

    if request.method == "POST":
        formset = SoilFormSet(request.POST or None, request.FILES or None, prefix='soils')
        cmcform = CMCFormSet(request.POST or None,request.FILES or None, prefix='cmcs')

        if formset.is_valid():
            formset.save()

        if cmcform.is_valid():
            cmcform.save()

    else:
        formset = SoilFormSet(prefix='soils')
        cmcform = CMCFormSet(prefix='cmcs')

    return render(request,'soil/soil_form.html',{'formset':formset,
                                                    'cmcform':cmcform,})

HTML

<div class="container">
  <form id="myform" method="post">
    {% csrf_token %}
    {{ formset.management_form }}
    {{ formset.as_p }}
    <input type="submit" value="Save" form='myform'/>
  </form>
</div>

<div class="container">
  <form id="cmcform" method="post">
    {% csrf_token %}
    {{ cmcform.management_form }}
    {{ cmcform.as_p }}
    <input type="submit" value="Save" form='cmcform'/>
  </form>
</div>

我希望你能帮助我。谢谢。

【问题讨论】:

    标签: python html django django-forms formset


    【解决方案1】:

    我找到了自己的答案。

    首先,要让 management_form 工作,它似乎需要在同一个表单标签下。如下:

    <div class="container">
      <form method="post">
        {% csrf_token %}
          {{ formset.management_form }}
          <table>
              {% for form in formset %}
              {{ form }}
              {% endfor %}
          </table>
          <input type="submit" name="soil_button"/>
    
          {{ cmcformset.management_form }}
          <table>
              {% for form in cmcformset %}
              {{ form }}
              {% endfor %}
          </table>
          <input type="submit" name="cmc_button"/>
      </form>
    </div>
    

    现在的问题是如何使用提交按钮只发布表单的期望部分。为此,我为提交按钮命名并指定 request.POST 需要具有该名称:

    if formset.is_valid() and 'soil_button' in request.POST:
        formset.save()
    
    if cmcformset.is_valid() and 'cmc_button' in request.POST:
        cmcformset.save()
    

    我希望这个解决方案对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 2020-04-09
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 2013-08-02
      • 2011-07-29
      • 2013-10-07
      相关资源
      最近更新 更多