【问题标题】:Django Template Tag Loop dictionary variableDjango 模板标签循环字典变量
【发布时间】:2015-11-25 04:07:06
【问题描述】:

我已经阅读了关于 key 中循环变量的所有模板标签帖子。显然 Django 不支持 key 中的循环变量,我不确定如何使用自定义模板标签。

我想显示这样的内容,但是如何使用 {% for i in mData %} 循环来实现呢?

{{ mData.0.name }}
{{ mData.1.name }}
{{ mData.2.name }}

{{ mData.0.age }}
{{ mData.1.age }}
{{ mData.2.age }}

mData 是一个字典列表。

mData = { "name":"alex", "age":"12"},{"name":"amy","age":"14"} ...

【问题讨论】:

  • 这种情况下的关键是什么?因为看起来mData 是一个字典列表。
  • 是的,它是一个字典列表...知道如何循环遍历它吗?我试过 {% for loop in mData.forloop.counter.name %} 但它不起作用...
  • 在这种情况下,重新排序视图中的数据结构,以便传递给模板的dict是{'age': [age0, age1, ...], 'name': [name0, name1, ...]}等等。否则,您会将数据准备代码放入模板中。
  • 感谢@dhke,但我的数据超过 5k 条目.. 重构它们会很痛苦:)

标签: python django


【解决方案1】:

考虑到您的数据位于字典列表中,例如:

my_data = [{"name" : "abc" , "age":20,...}, {} , {}...]

您可以通过这种方式访问​​模板中每个字典的所有属性:

{% for dict in my_data %}
<!-- Here dict would be each of the dictionary in my_data -->
<!-- You can access elements of dict using dot syntax, dict.property -->
   {{ dict.name }}, {{ dict.age }}, ... {{ dict.property }}
{% endfor %}

参考链接:Django templating language

如果你想按照你指定的顺序组织你的元素,你可以这样做:

Name List:
{% for dict in my_data %}
my_data.name
{% endfor %}

Age List:
{% for dict in my_data %}
my_data.age
{% endfor %}

...
Prpoerty List:
{% for dict in my_data %}
my_data.property
{% endfor %}

【讨论】:

  • 谢谢!这实际上按预期工作!无法相信解决方案如此简单!我正在玩自定义模板标签并阅读有关 jinja 等的内容即将放弃!
  • 只需阅读 django 文档中的模板语言章节,它写得很好,并通过大量示例进行了解释。一旦你通过它们,你就会掌握它。 djangobook.com/en/2.0/chapter04.html
  • 谢谢!我实际上正在阅读它,但还不太清楚,并且对我在 SO 上阅读的模板标签感到困惑 .. 也感谢您的详细回答!最后一个问题,如果我想遍历所有属性怎么办?我可以用列表来做到这一点,properties = ['name','age', ...] 吗? {% for i in properties %} my_data.properties {% endfor %}
  • 是的,您可以传递列表中的属性并使用 for 模板标签对其进行迭代,也可以参考:stackoverflow.com/questions/2170228/…
【解决方案2】:

Django 模板标签有意非常轻量级,这样您就不会在模板本身中放入太多代码。如果你需要做一些复杂的事情,比如遍历数据库中的所有其他条目,你应该在 views.py 而不是模板中进行设置。

对于您描述的场景,您需要做的就是遍历对象列表:

{% for data in datas %}
    {{ data.name }}
{% endfor %}
{% for data in datas %}
    {{ data.age }}
{% endfor %}

【讨论】:

  • 这行不通...我需要访问字典列表。例如。 mData.0.name ..... 我需要循环 0 到 1000,然后是姓名、年龄、性别...等。有什么想法吗?
  • 在views.py中你可以设置过滤器。 mData.objects.all()[:1000] 应该获取数据库中的前 1000 个条目。
【解决方案3】:

这解决了我的问题

{% for d in mData %}
{{ d.name }} {{ d.age }}
{% endfor %}

【讨论】:

  • 谢谢!这实际上按预期工作!无法相信解决方案如此简单!我正在玩自定义模板标签并阅读有关 jinja 等的内容即将放弃!
  • 如果可行,您可以将答案标记为已回答并请投票
【解决方案4】:
{% for k, v in mData.items %}
    {{ k }} {{ v }}

顺便说一句,PEP8 建议我们将变量命名为 lower + _,但不要像 javascript 或其他语言那样使用驼峰。

【讨论】:

  • 嗯,这行不通,因为我需要访问字典列表 ... mData.0.items 而不是 mData.items
猜你喜欢
  • 2012-03-28
  • 1970-01-01
  • 2011-11-25
  • 2013-05-06
  • 2016-08-31
  • 2011-09-19
  • 2018-11-17
  • 1970-01-01
  • 2019-10-22
相关资源
最近更新 更多