Как использовать текущий индекс для получения значения другого массива?

Я прочитал это, и у меня есть такой массив:

context[u'erreurs'] = {
    'aa': {'titres': [], 'liste': [], 'urls': []},
    'bb': {'titres': [], 'liste': [], 'urls': []},
    '...': {'titres': [], 'liste': [], 'urls': []}
}

В случае ошибки 'titres', 'liste' и 'urls' становятся массивом строк, заполненных адекватными значениями.

В моем шаблоне, если установлен erreur, я делаю это:

    {% for idx, tab in erreurs.items %}
        <ul>
        {% for e in tab.liste %}
            {% if user.is_authenticated %}
            <li><a href="{{ tab.urls[forloop.counter0] }}">{{ e }}</a></li>
            {% else %}
            <li>{{ e }}</li>
            {% endif %}
        {% endfor %}
        </ul>
    {% endfor %}

Я хотел бы использовать текущий индекс, чтобы использовать значение, которое находится в другом массиве, здесь: tab.urls. Не работает и выдает ошибку:

Could not parse the remainder: '[forloop.counter0]' from 'tab.urls[forloop.counter0]'

Как это решить?


person Olivier Pons    schedule 09.01.2016    source источник


Ответы (2)


К сожалению, шаблоны Django не поддерживают такой синтаксис. Вы должны собрать собственный фильтр шаблона:

# yourapp/templatetags/yourapp_tags.py:
from django import template
register = template.Library()

@register.filter
def at_index(array, index):
    return array[index]

и используйте его как:

{% load yourapp_tags %}
{{ tab.urls|at_index:forloop.counter0 }}
person Alex Morozov    schedule 09.01.2016
comment
Хорошо, но я прошу обходной путь или, может быть, предложение, как это сделать? Спасибо большое - person Olivier Pons; 09.01.2016

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

class YourModel(object):
    titre = ''
    liste = '' 
    url = ''

context[u'erreurs'] = {
    'aa': [],  # List of model
}

{% for idx, tab in erreurs.items %}
    <ul>
    {% for model in tab %}
        {{ model.titre }}
        {{ model.liste }}
        {{ model.url }}
    {% endfor %}
    </ul>
{% endfor %}
person Sayse    schedule 09.01.2016
comment
Спасибо за ваш ответ, но titre, liste и url - это массивы, поэтому я не могу с ними обращаться так. - person Olivier Pons; 10.01.2016
comment
@OlivierPons - конечно, можете, это всего лишь шаг предварительной обработки для преобразования трех массивов в один массив объектов перед назначением контексту - person Sayse; 10.01.2016