ChatGPT解决这个技术问题 Extra ChatGPT

在 Django 模板中按键访问字典

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

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

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

C
Community

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

{{ json.key1 }}

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

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


注意 blocktrans,它不允许点符号。 {% blocktrans with json.key1 as mykey %} {{ mykey }} {% endblocktrans %}
M
Micah Walter

正如@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 然后
R
River

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

观看次数:return render(request, self.template_name, {'dict': dict})

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

它打印 'myname'


E
Edouard Thiel

为了克服这个问题,你可以尝试这样的事情:

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