在 Django 模板中按键访问字典

我将字典从视图传递给模板。所以 {"key1":"value1","key2":"value2"}被传入并通过键进行循环,值对是可以的,但是我还没有找到一个从特定键直接访问视图的优雅解决方案,比如 "key1",例如 bu json.item [“ key1”]。我可以使用一些 if/then 语句,但我宁愿直接做,有办法吗?

下面是 html 模板中的循环代码:

{% for key, value in json.items %}
<li>{{key}} - {{value}}</li>
{% endfor %}
120369 次浏览

Django 模板语言支持如下查找字典键:

\{\{ json.key1 }}

请参阅 变量和查找上的模板文档。

模板语言没有提供显示 json[key]的方法,其中 key是一个变量。您可以编写一个模板过滤器来做到这一点,正如在这个 堆栈溢出问题的答案中所建议的那样。

为了克服这个问题,你可以试试这样的方法:

def get_context_data(self, **kwargs):
context['cart'] = []
cart = Cart()
cart.name = book.name
cart.author = book.author.name
cart.publisher = book.publisher.name
cart.price = 123
cart.discount = 12
cart.total = 100
context['cart'].append(cart)
return context




class Cart(object):
"""
Cart Template class


This is a magic class, having attributes
name, author, publisher, price, discount, total, image
You can add other attributes on the fly
"""
pass




By this way you can access your cart something like this:
{% for item in cart %}
<div class="jumbotron">
<div>
<img src="\{\{item.image}}" />
<div class="book_name"> <b>\{\{item.name}}</b></div>
<div class="book_by"><i>\{\{item.author}}</i></div>
<span>Rs. \{\{item.price}}</span> <i>\{\{item.discount}}% OFF </i>
<b>Rs. \{\{item.total}}</b>
{% endfor %}

例如,发送以下字典 dict = {'name':'myname','number':'mynumber'}

观点: return render(request, self.template_name, {'dict': dict})

要在 html 模板中呈现值: <p>\{\{ dict.name }}</p>

它可以打印 'myname'

正如@Alasdair 所建议的,您可以使用模板过滤器。 在 templatetags目录中,创建以下文件 dict_key.py:

from django.template.defaultfilters import register


@register.filter(name='dict_key')
def dict_key(d, k):
'''Returns the given key from a dictionary.'''
return d[k]

然后,在你的 HTML 中,你可以写:

{% for k in json.items %}
<li>\{\{ k }} - \{\{ json.items|dict_key:k }}</li>
{% endfor %}