Джанго шаблон для цикла. Участник до - PullRequest
0 голосов
/ 27 сентября 2011

Я хочу создать такой цикл:

{% for object in objects %}
    {% if object.before != object %}
         {{ object }} this is different
    {% else %}
        {{ object }} this is the same
{% endfor %}

На основании https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#for Не могу. Неужели нет простого способа сделать это? Или мне просто нужно использовать счетчик и проверить на objects[counter-1]?

P.S. .before является теоретическим, а объекты - простым списком запросов. Я хочу взять и сделать что-то с членом цикла, который встречался до текущего элемента цикла.

Ответы [ 4 ]

5 голосов
/ 27 сентября 2011

Проверка в случае изменения тег шаблона

0 голосов
/ 02 августа 2012

Встроенные теги и фильтры шаблонов не облегчают (с Django 1.4), но это возможно, используя тег with для кэширования переменных и add, slugify и slice фильтрует для создания нового списка только с одним членом.

В следующем примере создается новый список, единственным участником которого является предыдущий член forloop:

{% for item in list %}
    {% if not forloop.first %}
        {% with forloop.counter0|add:"-1" as previous %}
        {% with previous|slugify|add:":"|add:previous as subset %}
        {% with list|slice:subset as sublist %}

        <p>Current item: {{ item }}</p>
        <p>Previous item: {{ sublist.0 }}</p>

        {% endwith %}
        {% endwith %}
        {% endwith %}
    {% endif %}
{% endfor %}

Это неЭто элегантное решение, но система шаблонов django имеет две ошибки, которые делают этот хак неизбежным для тех, кто не хочет писать собственные теги:

  1. Синтаксис шаблона Django не допускает вложенностьфигурные скобки.В противном случае мы могли бы сделать это:

        {{ list.{{ forloop.counter|add:-1  }} }}
    
  2. Оператор поиска не принимает значения, хранящиеся с использованием with (и, возможно, по уважительной причине)

        {% with forloop.counter|add:-1 as index %}
            {{ list.index }}
        {% endwith %}
    
0 голосов
/ 27 сентября 2011

Для этого есть «простой способ»: написать собственный тег шаблона.Они действительно не сложны.Это, вероятно, поможет (не проверено):

@register.simple_tag
def compare_objects(object_list):
    comparisons = []
    for i in range(1, len(object_list)):
        if object_list[i] > object_list[i-1]:
            comparisons.append('bigger')
        else:
            comparisons.append('smaller')
    return comparisons
0 голосов
/ 27 сентября 2011

Этот код должен прекрасно работать как шаблон django, если object имеет свойство или метод без аргументов, называемый before, а objects является итеративным (и определяется <<). </p>

{% for object in objects %}
    {% if object.before < object %}
        this is bigger
    {% else %}
        this is smaller
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...