如何在 django 模板中呈现有序字典?

Posted

技术标签:

【中文标题】如何在 django 模板中呈现有序字典?【英文标题】:How to render an ordered dictionary in django templates? 【发布时间】:2011-07-12 03:20:15 【问题描述】:

我正在尝试学习 django 模板,但这并不容易。 我有一个包含要使用模板呈现的字典的 views.py。字典由键值对组成,其中键是唯一名称,值是与这些名称关联的一些值。我以以下方式呈现字典:

return render_to_response('results.html', 'data': results_dict)

现在我的问题是,在我的模板中,我需要以字母(或 ASCIIbetical)顺序显示名称以及亲属值。 实际上在我的模板中我有:

<table>
% for key, value in data.items %
    <tr>
        <td>  key : </td> <td>  value  </td>
    </tr>
</table>

如何以排序方式呈现数据? 非常感谢。

【问题讨论】:

【参考方案1】:

在views.py(Python2)中:

return render_to_response('results.html',
    'data': sorted(results_dict.iteritems()))

或者在views.py(Python3)中:

return render_to_response('results.html',
    'data': sorted(results_dict.items()))

在模板文件中:

% for key, value in data.items() %
    <tr>
        <td>  key : </td> <td>  value  </td>
    </tr>
% endfor %

【讨论】:

% for key, value in data.items() % thisd 在 Django 模板中不起作用 @MukeshKumar - 当我们在 django 模板中使用函数时需要避免 () 所以只需要使用 'data.items'【参考方案2】:

虽然更改视图中的代码更可取,但您也可以使用 dictsort 模板标签:

https://docs.djangoproject.com/en/stable/ref/templates/builtins/#std:templatefilter-dictsort

<table>
% for key, value in data.items|dictsort:"0.lower" %
    <tr>
        <td>  key : </td> <td>  value  </td>
    </tr>
</table>

【讨论】:

很好的答案。值得一提的是,我们也可以使用dictsortreverse 进行倒序排序。 完美。谢谢 感谢您 - 完美运行。由于最后一个示例here,我几乎发现了这一点,但在尝试dictsort:0 时遇到了困难(即0 上没有引号)。任何人都可以在文档中解释这一点吗?【参考方案3】:

另一个对我来说效果很好的解决方案,我认为它更简单。它使用OrderedDict()more info

在您的views.py 文件中添加:

from collections import OrderedDict
def main(request):
    ord_dict = OrderedDict()
    ord_dict['2015-06-20'] = 
    ord_dict['2015-06-20']['a'] = '1'
    ord_dict['2015-06-20']['b'] = '2'
    ord_dict['2015-06-21'] = 
    ord_dict['2015-06-21']['a'] = '10'
    ord_dict['2015-06-21']['b'] = '20'
    return render(request, 'main.html', 'context': ord_dict)

然后在你的模板中,你可以这样做:

<table>
% for key, value in context.items %
    <tr>
        <td> key </td>
        <td> value.a </td>
        <td> value.b  </td>
    </tr>
% endfor %
</table>

这将按照放入字典的顺序返回字典的键。

2015-06-20  1   2
2015-06-21  10  20

【讨论】:

有效。在OrderedDict() 调用中完成这一切会很好【参考方案4】:

刷新旧问题,但这是我作为编程菜鸟花了一些时间的东西。 它有点扩展了 Yuji Tomita 的答案。

如何对如下所示的字典进行排序:

model_A_object: key: value, ...,...

按model_A_object.field。

我用 for 循环填充它,并用它来存储一些聚合等数据,用于我传递给模板的查询集。

我已经设法做到了(通过#Django 帮助中的 Shubuntu):

    result = sorted(dictionary.iteritems(), key= lambda (k, v) :  (k.field, v))

然后在模板中:

    % for model_A_object, data in result %
        % for key, value in data.items %
            ...
        % endfor %
    % endfor %

简洁明了,但对于初学者来说并不容易弄清楚。请注意,第一个 for 循环的 result 不是 result.items 因为它不再是字典,而是元组列表。

希望对某人有所帮助。

【讨论】:

以上是关于如何在 django 模板中呈现有序字典?的主要内容,如果未能解决你的问题,请参考以下文章

将带有对象列表的字典作为 django 中的值呈现,但模板不显示值

Django - 在模板中格式化/访问 Pandas.to_dict() 数据框

如何正确使用 % include % 标签在 django 中呈现模板(如部分)?

如何在 Django 模板中阅读字典

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

如何在 django 模板中访问字典值