70

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

这是html模板中的循环代码:

{% for key, value in json.items %} 
  <li>{{key}} - {{value}}</li>
 {% endfor %}
4

4 回答 4

105

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

{{ json.key1 }}

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

模板语言不提供显示方式json[key],其中key是变量。您可以编写一个模板过滤器来执行此操作,正如Stack Overflow question的答案中所建议的那样。

于 2013-11-02T18:15:51.893 回答
13

正如@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 %}
于 2018-06-28T19:32:13.277 回答
8

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

意见: return render(request, self.template_name, {'dict': dict})

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

它打印'myname'

于 2016-01-14T05:06:18.640 回答
5

To overcome this problem you could try something like this:

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 %}
于 2014-05-06T10:03:18.017 回答