【问题标题】:How can I display multiple django modelformset forms in grouped fieldsets?如何在分组字段集中显示多个 django modelformset 表单?
【发布时间】:2023-03-06 05:54:01
【问题描述】:

我遇到了需要在同一页面上提供多个模型支持的表单的问题。我了解如何使用单个表单来执行此操作,即只需创建两个表单,将它们命名为不同的名称,然后在模板中使用适当的名称。

现在,您究竟如何扩展该解决方案以使用模型表单集?当然,问题在于每个“表单”必须在适当的字段集中一起呈现。

例如,我希望我的模板生成如下内容:

基地说明: 想要冰淇淋吗? 基地说明: 想要冰淇淋吗?

我正在使用这样的循环来处理结果(在表单验证之后)

base_models = base_formset.save(commit=False)
like_models = like_formset.save(commit=False)
for base_model, likes_model in map(None, base_models, likes_models):

按我的预期工作(我使用 map 是因为表单的数量可能不同)。问题是我想不出用模板引擎做同样事情的方法。如果我将所有基本模型布局在一起,然后将所有喜欢的模型布局在一起,系统确实可以工作,但它不符合布局要求。

编辑:更新了问题陈述,以更清楚地了解我正在处理的内容(我正在处理模型而不是 for 循环中的表单)

【问题讨论】:

    标签: python django-models django-templates django-forms


    【解决方案1】:

    在视图中:

    forms = itertools.izip(base_forms, likes_forms)
    

    在模板中:

    {% for (base_form,like_form) in forms %}
    

    【讨论】:

    • 将上面的内容更改为 forms = itertools.izip_longest(base_forms.forms, likes_forms.forms) 就很接近了。在 shell 中迭代这些似乎会产生正确的结果,但是......我实际上正在处理 3 个表单集,让我们称它们为基础、喜欢、不喜欢。在渲染中,我得到了正确显示的喜欢,但我没有得到基本或不喜欢的输出。我认为这是正确的轨道。我可以更改 izip_longest 调用的顺序,它总是只显示中间选项。
    【解决方案2】:

    在进行了大量的探索和黑客实验后,我想出了以下解决方案,这在很大程度上要感谢 Ignacio Vazquez-Abrams :)

    在视图中:

    forms = itertools.izip_longest((None,),base_formset.forms, likes_formset.forms)
    

    在模板中:

    {% for (garbage1, base_form, like_form, garbage2) in forms %}
    

    精明的读者可能会注意到,解包列表中的参数数量比 izip_longest() 方法的数量大一。您可能还注意到有一个有效的空白列表作为第一个参数。

    我永远无法让模板显示列表中的第一个参数,因此是虚拟的第一个参数。我还发现模板中呈现了 N-1 个列表元素。我还偶然发现了模板不太关心大小不匹配的事实,因此通过填充正面和背面,我能够获得我真正想要显示的表单!

    注意:在处理 POST 时,我只是构建我正在使用的表单集,因为所有幻像数据都不会通过 POST 发回。

    当然不是最干净的解决方案,而且它可能极易损坏升级,但它对我来说足够实用。

    【讨论】:

      猜你喜欢
      • 2021-01-24
      • 1970-01-01
      • 2011-10-11
      • 2020-03-09
      • 2018-04-15
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      相关资源
      最近更新 更多