Django 模板和列表字典的一部分

Posted

技术标签:

【中文标题】Django 模板和列表字典的一部分【英文标题】:Django template and part of a dictionary of lists 【发布时间】:2015-12-05 18:59:53 【问题描述】:

在 Django 中,我想在列表字典中显示一些条目。

我的上下文是:

keys = ['coins', 'colors']
dict = 'colors':['red', 'blue'],
        'animals':['dog','cat','bird'],
        'coins':['penny','nickel','dime','quarter']  

模板代码:

<ul>% for k in keys %
    <li> k ,  dict.k|length : [% for v in dict.k %  v , % endfor %]
% endfor %</ul>

我想看看:

* coins,4: [penny, nickel, dime, quarter,]
* colors,2: [red, blue,]

但我实际看到的是键但没有值:

* coins,0: []
* colors,0: []

注意:我也尝试了dict.k 而不是dict.k,但正如预期的那样,这只是在模板渲染中给出了解析错误。在基本列表正常工作后,我将用forloop.last 去掉结尾的逗号。

显示列表字典中选定值的秘诀是什么?

问题django template and dictionary of lists 显示整个字典,但我的要求是只显示可能非常大的字典中的几个条目。

【问题讨论】:

本质上,Django 让在模板中使用dict 并以任何正常方式访问变得不必要的痛苦。你说得对,dict.k 查找不起作用,因为它正在寻找文字 k 属性而不是模板变量的值。对于这个用例,我建议您编写自己的自定义标签或过滤器来完成这项工作。 【参考方案1】:

问题(正如您所怀疑的)是 dict.k 被评估为 dict['k'] ,其中 'k' 不是字典中的有效键。尝试使用 dict.items 迭代每个项目对,并仅显示您关心的键的结果:

<ul>% for k, v in dict.items %
        % if k in keys %
            <li>
             k ,  v|length : [% for val in v %  val ,% endfor %]
           </li>
        % endif %
    % endfor %
</ul>

【讨论】:

items 还是iteritems @ShangWang 物品,我的错。 是的,感谢您证实了我的担忧。我希望避免仅仅为了显示一些条目而处理整个字典,但我猜 Django 模板不是那种 Python 的。看起来我必须重写views.py才能将一堆子集dicts传递给模板。 另一种方法是编写一个简单的模板过滤器来进行动态查找:它是三行代码,请参阅this answer中的示例【参考方案2】:
<ul>
    % for k, v in dict.items % # instead of iterating keys, iterate dict
        % if k in keys % # if key found in keys
            <li>
                 k ,  v|length : [% for val in v %  val ,% endfor %]
            </li>
        % endif %
    % endfor %
</ul>

【讨论】:

以上是关于Django 模板和列表字典的一部分的主要内容,如果未能解决你的问题,请参考以下文章

Django模板语言解包字典

Django 模板中的日期/时间格式

django 默认模板字典和列表的写法

通过 Django 模板中的列表字典进行处理

使用 Django 模板(列表和字典)将 Python 数据结构转换为 js 数据结构

如何在 Django 模板中访问字典列表