【问题标题】:Accessing dictionary by key in Django template在 Django 模板中按键访问字典
【发布时间】:2013-11-13 17:39:32
【问题描述】:

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

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

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

【问题讨论】:

    标签: python django json


    【解决方案1】:

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

    {{ json.key1 }}
    

    请参阅variables and lookups 上的模板文档。

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

    【讨论】:

    • 小心blocktrans,它不允许点符号。 {% blocktrans with json.key1 as mykey %} {{ mykey }} {% endblocktrans %}
    【解决方案2】:

    要解决这个问题,您可以尝试以下方法:

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

    【讨论】:

      【解决方案3】:

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

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

      在 html 模板中渲染值: &lt;p&gt;{{ dict.name }}&lt;/p&gt;

      它打印'myname'

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 也从那里,我使用.get,所以如果密钥不存在,它不会返回任何内容。如果你这样做 dictionary[key] 它将引发 KeyError 然后
        猜你喜欢
        • 2021-04-10
        • 2015-07-09
        • 2021-10-17
        • 2019-09-01
        • 2014-02-08
        • 1970-01-01
        相关资源
        最近更新 更多