Использовать переменную в качестве словарного ключа в шаблоне Django - PullRequest
54 голосов
/ 24 мая 2010

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

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

В python это может быть выполнено простым

ratings[product.id]

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

Ответы [ 4 ]

81 голосов
/ 22 мая 2012

Создайте тег шаблона следующим образом (в вашем проекте / templatetags):

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

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

{{dictionary|keyvalue:key_variable}}
20 голосов
/ 24 мая 2010

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

{% for product, rating in product_list %}
    <h1>{{ product.name }}</h1><p>{{ rating }}</p>
{% endfor %}
13 голосов
/ 29 декабря 2012

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

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

<div>So here it is:
{% for key, value in d.items %}
    {% if k == key %}
        {{ value }}
    {% endif %}
{% endfor %}
</div>
9 голосов
/ 02 июля 2014

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...