如何在Django中用一个提交按钮提交多个表单?

1 投票
3 回答
4840 浏览
提问于 2025-04-17 17:23

我已经成功使用modelformset_factory创建了我需要的表单。

avaluos = Avaluo.objects.filter(Estatus__contains='CONCLUIDO',Factura__isnull=True)
FacturaFormset = modelformset_factory(Avaluo,form=FacturaForm,extra=0)

现在,这个方法为每一行生成了以下的HTML代码:

<form id="id-FacturaForm" class="blueForms" method="post">[..]</form>
<form id="id-FacturaForm" class="blueForms" method="post">[..]</form>
<form id="id-FacturaForm" class="blueForms" method="post">[..]</form>

我想用一个提交按钮来提交所有的表单。

有没有什么好主意?

更新

我最后使用了django-crispy-forms,这个工具让我能够为每一行生成输入框,然后我只是手动添加了表单和提交按钮。

   self.helper.form_tag = False


{{example_formset.management_form }}
       {% for a,b in olist %}
{{ b.id }}
<tr>
    <td style="width:10px;"> {% crispy b %} </td>
    <td> {{a.id}} </td>     
</tr>
{% endfor %} 

3 个回答

0

如果你想创建很多看起来“相同”的表单,也就是说它们的样子都一样,就像是属于一个大元素的多个小元素,你其实不需要为每个表单组都创建一个表单标签。

如果我没理解错的话,你是想为一个单独的 avaluo 对象编辑很多 facturas,对吗?这样的话,你可以用一个“avaluo”表单来表示,里面包含多个内联表单组,每个表单组对应一个“factura”。

你可以看看这个 内联表单组工厂,而不是使用模型表单组工厂。

0

我觉得你可能需要用Ajax来实现这个功能。否则,一旦提交了一个表单,你就无法再返回去处理其他表单了。

有一些jQuery的表单库可以让这个过程变得相对简单。例如,http://malsup.com/jquery/form/

它的样子大概是这样的:

$('#button-id').click(function() {
  $('.blueForms').ajaxSubmit();
});

当然,你还需要处理错误情况,并确保所有表单都已经提交完毕。

10

想了解更多关于 模型表单集 的内容吗?其实你不需要在页面上使用多个 form 标签,这正是使用表单集的目的所在。

<form method="post" action="">
    {{ factura_formset.management_form }}
    <table>
        {% for form in factura_formset %}
            {{ form }}
        {% endfor %}
    </table>
</form>

另外,每当你在一个页面上多次使用 id 属性时……世界上的某个开发者就会为此感到心痛,晚上睡不着觉。

撰写回答