Подтвердить что ты не робот

Использовать переменную в качестве словаря в шаблоне Django

Я хотел бы использовать переменную как ключ в словаре в шаблоне Django. Я не могу, чтобы жизнь меня определяла, как это сделать. Если у меня есть продукт с именем или полем ID и словарь рейтингов с индексами идентификаторов продуктов, я бы хотел сказать:

{% for product in product_list %}
     <h1>{{ ratings.product.id }}</h1>
{% endfor %}

В python это будет выполнено с помощью простого

ratings[product.id]

Но я не могу заставить его работать в шаблонах. Я пробовал использовать с... без кубиков. Идеи?

4b9b3361

Ответ 1

Вам необходимо заранее подготовить свои данные, в этом случае вам следует передать список двух кортежей в ваш шаблон:

{% for product, rating in product_list %}
    <h1>{{ product.name }}</h1><p>{{ rating }}</p>
{% endfor %}

Ответ 2

Создайте тег шаблона, подобный этому (в вашем проекте /templatetags ):

@register.filter
def keyvalue(dict, key):    
    return dict[key]

Использование:

{{dictionary|keyvalue:key_variable}}

Ответ 3

Существует очень грязное решение:

<div>We need d[{{ k }}]</div>

<div>So here it is:
{% for key, value in d.items %}
    {% if k == key %}
        {{ value }}
    {% endif %}
{% endfor %}
</div>

Ответ 4

Основываясь на eviltnan ответе, его фильтр вызовет исключение, если key не является ключом dict.

Фильтры никогда не должны поднимать исключения, но изящно отказывается. Это более надежный/полный ответ:

@register.filter
def keyvalue(dict, key):    
    try:
        return dict[key]
    except KeyError:
        return ''

В принципе, это будет делать то же самое, что и dict.get(key, '') в коде Python, и также может быть написано таким образом, если вы не хотите включать блок try/except, хотя он более явный.