在Django模板中按键访问字典

时间:2013-11-02 18:08:57

标签: python django json

我将字典从我的视图传递给模板。所以{"key1":"value1","key2":"value2"}被传入并循环遍历键,值对很好,但是我没有找到一个优雅的解决方案,直接从特定键的视图访问,比如说"key1"例如bu json。项目[ “KEY1”。我可以使用一些if / then语句,但我宁愿直接做一下吗?

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

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

4 个答案:

答案 0 :(得分:68)

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

{{ json.key1 }}

查看variables and lookups上的模板文档。

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

答案 1 :(得分:4)

要解决这个问题,你可以试试这样的事情:

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 %}

答案 2 :(得分:3)

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

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

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

打印'myname'

答案 3 :(得分:3)

正如@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 %}