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_seatsempty_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模板标签运行循环不是所有对象[重复]

Django-模板标签方法

django 模板中的 for 循环 - 列表对象没有属性“get”

无法在 Django 模板文件的 for 循环中使用条件标签

25Django for标签详解

django之模板层