在遍历Django表单集时显示附加数据

4 投票
2 回答
1964 浏览
提问于 2025-04-15 23:38

我有一份足球比赛的列表,想要显示一些表单。这份列表来自一个远程的地方。

matches = ["A vs. B", "C vs. D", "E vs, F"]
matchFormset = formset_factory(MatchForm,extra=len(matches))
formset = MatchFormset()

在模板那边,我想把表单集合显示出来,并且要有对应的标题(比如“球队A对球队B”)。

{% for form in formset.forms %}
    <fieldset>
        <legend>{{TITLE}}</legend>
        {{form.team1}} : {{form.team2}}
    </fieldset>
{% endfor %}

那么我该怎么让 TITLE 包含当前表单的正确标题呢?换句话说,我该如何在遍历 formset.forms 的同时,也能用相同的索引去遍历 matches 呢?

谢谢你的帮助!

2 个回答

2

这是对Alex回答的补充。

在我对Alex的回答评论后,我做了一些阅读,发现把管理表单(其实就是一个包含了关于表单组中有多少个表单的信息的元表单)放到你的模板里是很重要的。这样你提交的数据才会被当作一个表单组来处理,而不是一堆散乱的表单。这里有相关文档

我知道的将管理表单放入模板的两种方法是:

  1. 除了你创建的数据结构外,还要发送表单组,然后用 {{ my_formset.management_form }} 来渲染管理表单。
  2. 在你的视图中渲染管理表单,并将其作为一个项目发送到模板。

当然,如果你使用Alex的第一种方法,表单组已经可用了,所以你可以直接添加管理表单。

6

我觉得在Django的模板语言里,没有直接用来索引的内置功能,但有一个可以用来切片的功能(叫做slice)。所以,如果真的需要的话,你可以用一个只包含一个元素的切片(用forloop.counter0:forloop.counter)和.first来提取你想要的值。

当然,如果能在Python那边做点配合,会简单很多。你可以在Python代码里设置一个上下文变量forms_and_matches,让它等于zip(formset.forms, matches),然后在模板中用{% for form, match in forms_and_matches %}来简单明了地获取这两个项目(假设你使用的是Django 1.0或更高版本)。

撰写回答