我在同一页面上需要提供多个模型支持的表单时遇到问题。我理解如何使用单个表单执行此操作,即只需创建两个表单,将它们称为不同的表单,然后在模板中使用相应的名称。
现在您如何扩展该解决方案以使用modelformsets?当然,皱纹是每个'形式'必须在适当的字段集中一起渲染。
例如,我希望我的模板可以生成如下内容:
Home Base描述: 想要冰淇淋? Home Base描述: 想要冰淇淋?
我正在使用这样的循环来处理结果(在表单验证之后)
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):
按照我的预期工作(我正在使用地图,因为表格的数量可能不同)。问题是我无法想出用模板引擎做同样事情的方法。如果我将所有基本模型布局在一起然后所有喜欢的模型在病房之后布局,系统确实有效,但它不符合布局要求。
编辑:更新问题陈述以更清楚我正在处理的是什么(我正在处理模型而不是for循环中的表格)
答案 0 :(得分:2)
在视图中:
forms = itertools.izip(base_forms, likes_forms)
在模板中:
{% for (base_form,like_form) in forms %}
答案 1 :(得分:0)
在做了相当多的探索和黑客试验后,我想出了以下解决方案,非常感谢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发回。
当然不是最干净的解决方案,它可能极易受到升级破坏的影响,但它现在已经足够实用了。