Loop.nextitem не работает с текущим значением из данных

Мне нужно сравнить 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>

🤔 А знаете ли вы, что...
С Python можно создавать веб-скраперы для извлечения данных из веб-сайтов.


1
28
1

Ответ:

Решено

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>