【问题标题】:Make a django template object iterable使 django 模板对象可迭代
【发布时间】:2012-08-10 01:28:20
【问题描述】:

我有一本有很多特点的字典:

sort_options = SortedDict([
    ("importance" , ("Importance" , "warning-sign" , "importance")),
    ("effort" , ("Effort" , "wrench" , "effort")),
    ("time_estimate" , ("Time Estimate" , "time" , "time_estimate")),
])  

我还有一个操作列表作为查询结果。每个动作都有这些属性;在我的模板中,我可以调用 {{ action.effort }} 或 {{ action.time_estimate }} 并获得结果。

我正在遍历我的 sort_options 以填充 twitter 引导图标:

{% for key, icon in sort_options.items %}
    <i class="icon-{{ icon.1 }}"></i>
{% endfor %}

但我还想显示每个属性的操作值。本质上是这样的:

{% for key, icon in sort_options.items %}
    <i class="icon-{{ icon.1 }}"></i>
    {{ action.key }}
{% endfor %}

关键将解析为“重要性”或“努力”。我知道这行不通。所以我试图利用this question 中提出的解决方案。

解决方案提出了一个模板过滤器:

def hash(h,key):
    if key in h:
        return h[key]
    else:
        return None
register.filter(hash)

{{ user|hash:item }}

问题使用的字典看起来像这样:

{'item1': 3, 'name': 'username', 'item2': 4}

我尝试了以下方法:

{% for key, icon in sort_options.items %}
    <i class="icon-{{ icon.1 }}"></i>
    {{ action|hash:key }}
{% endfor %}

但出现错误:

Caught TypeError while rendering: argument of type 'Action' is not iterable

我相信这是因为模板过滤器只获取对象的一个​​属性(可能是名称),而不是整个字典:

[<Action: Action_one>, <Action: Task_two>...]

有没有办法强制模板将完整的对象传递给模板标签?

【问题讨论】:

  • 请确保您指的是模板标签,而不是 模板过滤器
  • 忽略其他问题。你到底想达到什么目的?
  • 抱歉问题太仓促了。上面已经很清楚了
  • 为了将来参考,提到您正在迭代动作,然后为每个 action 迭代 sort_options 会很方便。最后,看起来像[.., ..] 的东西是一个列表,而不是字典。您的“整个字典”最好描述为“Action 对象列表”。
  • 你不能只计算视图中的那些 'action.key',然后尝试将它们作为字典发送到模板,这样你就不必在模板中找到 action.key 了吗?跨度>

标签: python django django-templates


【解决方案1】:

我想我终于明白了。你想要相当于

getattr(action, key)

在您的模板中。 This answer 描述了您需要这样做的 getattribute 模板标签。

【讨论】:

    猜你喜欢
    • 2013-12-16
    • 2019-09-02
    • 2019-10-15
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 2022-11-21
    相关资源
    最近更新 更多