Django模板标签搜索通过for循环寻找特定对象,如果没有找到则默认
Posted
技术标签:
【中文标题】Django模板标签搜索通过for循环寻找特定对象,如果没有找到则默认【英文标题】:Django template tag search through for-loop looking for specific object with default if not found 【发布时间】:2016-11-26 23:14:33 【问题描述】:我将一组人的查询集传递给我的 django 模板,其中一些人已被分配了“座位”,而其他人则没有。座位不能分配给任何人,因此保持空位。对于每个座位,我希望模板循环通过查询集来寻找那个座位上的人。如果 for 循环找不到该座位的任何人,我希望他们呈现一个空座位。这是我的想法:
% for person in people %
% if person.seat_num = 1 %
<div class="filled_seat"></div>
% endif %
% empty %
<div class="empty_seat"></div>
% endfor %
除了我意识到 % empty % 仅在被迭代的集合为空时触发,而如果找不到座位,我需要有一个默认值(也就是集合中的任何内容都无法在“if”条件下存活。
【问题讨论】:
在视图中生成filled_seats
和empty_seats
查询集并将它们传递给模板可能会更好,而不是在模板中进行大量计算。
【参考方案1】:
是的,因为for...empty 就是这样工作的。它基本上无法知道您的座位是否为空,因为您需要实现自己的逻辑。
我不知道您的模型的详细信息,但从您的示例中猜测您需要执行以下操作:
% for person in people %
% if person.seat_num = 0 %
<div class="empty_seat"></div>
% else %
<div class="filled_seat"></div>
% endif %
% endfor %
【讨论】:
这是我首先想到的,但问题是它会为不在座位 1 上的每个人生成一个 empty_seat div,而我希望最终结果是一个单一的“filled_seat” div或单个“empty_seat” div。 根据你的模型,没有座位的人在 seat_num 中有什么? 我做了一个更新,所以如果人没有座位(我假设它是 0)它是空的或被填满。你明白了,逻辑取决于你如何在模型中表示空座位(我不知道)【参考方案2】:John Gordon 的评论让我意识到我不应该尝试在模板本身做太多事情。在视图中,我创建了一个名为“席位”的列表并填充了相应的席位,然后将其传递给模板:
seats = []
for n in range(4):
try:
seats.append(students.objects.get(seat_num=n+1))
except:
seats.append(None)
然后,我使用 for 循环一次循环遍历一个座位,并检查该座位是否已满,然后生成适当的 div:
% for seat in seats %
<td>
% if seat %
<div class="filled_seat"></div>
% else %
<div class="empty_seat"></div>
% endif %
</td>
% endfor %
【讨论】:
以上是关于Django模板标签搜索通过for循环寻找特定对象,如果没有找到则默认的主要内容,如果未能解决你的问题,请参考以下文章
django 模板中的 for 循环 - 列表对象没有属性“get”