Ответ 1
Вам необходимо заранее подготовить свои данные, в этом случае вам следует передать список двух кортежей в ваш шаблон:
{% for product, rating in product_list %}
<h1>{{ product.name }}</h1><p>{{ rating }}</p>
{% endfor %}
Я хотел бы использовать переменную как ключ в словаре в шаблоне Django. Я не могу, чтобы жизнь меня определяла, как это сделать. Если у меня есть продукт с именем или полем ID и словарь рейтингов с индексами идентификаторов продуктов, я бы хотел сказать:
{% for product in product_list %}
<h1>{{ ratings.product.id }}</h1>
{% endfor %}
В python это будет выполнено с помощью простого
ratings[product.id]
Но я не могу заставить его работать в шаблонах. Я пробовал использовать с... без кубиков. Идеи?
Вам необходимо заранее подготовить свои данные, в этом случае вам следует передать список двух кортежей в ваш шаблон:
{% for product, rating in product_list %}
<h1>{{ product.name }}</h1><p>{{ rating }}</p>
{% endfor %}
Создайте тег шаблона, подобный этому (в вашем проекте /templatetags ):
@register.filter
def keyvalue(dict, key):
return dict[key]
Использование:
{{dictionary|keyvalue:key_variable}}
Существует очень грязное решение:
<div>We need d[{{ k }}]</div>
<div>So here it is:
{% for key, value in d.items %}
{% if k == key %}
{{ value }}
{% endif %}
{% endfor %}
</div>
Основываясь на eviltnan ответе, его фильтр вызовет исключение, если key
не является ключом dict
.
Фильтры никогда не должны поднимать исключения, но изящно отказывается. Это более надежный/полный ответ:
@register.filter
def keyvalue(dict, key):
try:
return dict[key]
except KeyError:
return ''
В принципе, это будет делать то же самое, что и dict.get(key, '')
в коде Python, и также может быть написано таким образом, если вы не хотите включать блок try/except, хотя он более явный.