loop.nextitem 不适用于数据中的当前值

loop.nextitem doesn't work with current value from data

我需要将 postback.campaign_id 与下一项的值进行比较。如果相似,那么,我什么都不打印,如果不相似,那么,打印我的行。

但是,这段代码输出了所有内容。

<table>
    <tr>
        <td class="expand expand-campaign"><a>Test</a></td>
        <td>{{ account_id }}</td>
    </tr>
    {% for postback in postbacks %}
        {% if loop.nextitem is defined and postback.campaign_id != loop.nextitem[0] %}
        <tr>
            <td></td><td></td>
            <td><input type="checkbox"></td>
            <td class="expand expand-site"><a>{{ postback.campaign_id }}</a></td>
        </tr>
      {% endif %}
    {% endfor %}
</table>

loop.nextitem 包含下一项中的整个变量。所以,如果它是一个字典或对象,就像你的情况一样,你可以像循环下的当前对象一样访问它的属性。

在您的情况下,这意味着:

postback.campaign_id != loop.nextitem.campaign_id

您还遇到了您的最后一项总是被条件 loop.nextitem is defined 跳过的问题。由于您将始终打印一系列相似项目的最后一项,因此您可以完美地做到:

{% if loop.nextitem is undefined 
     or postback.campaign_id != loop.nextitem.campaign_id 
%}

另请注意,Jinja 中有一个 loop.changed() 构造,在这个特定用例中可以派上用场。


因此,列表如下:

postbacks = [
  {'campagn_id': 1},
  {'campagn_id': 2},
  {'campagn_id': 2},
  {'campagn_id': 3},
  {'campagn_id': 3},
]

Jinja 的这段代码:

<table>
  {%- for postback in postbacks %}
    {%- if loop.changed(postback.campaign_id) %}
      <tr>
        <td class="expand expand-site">
          {{ postback.campaign_id }}
        </td>
      </tr>
    {%- endif %}
  {%- endfor %}
</table>

它呈现为:

table {
  border-collapse: collapse;
}
td {
  border: 1px solid;
  padding: 4px;
}
<table>
      <tr>
        <td class="expand expand-site">
          1
        </td>
      </tr>
      <tr>
        <td class="expand expand-site">
          2
        </td>
      </tr>
      <tr>
        <td class="expand expand-site">
          3
        </td>
      </tr>
</table>