【问题标题】:Accessing Specific Dictionary Values by Key in Django Template在 Django 模板中按键访问特定的字典值
【发布时间】:2015-07-09 03:59:25
【问题描述】:

我知道使用“。”访问模板中的字典项的符号(就像this post 解释的那样),但是当我尝试访问特定键时,它不起作用。怎么了?

我的字典: images[mykey] = "the value string"

然后在模板中,我尝试按键访问,但不起作用:

{% for x in otherdict %}
    {{ x }}
    {{ images.items.x }}
{% endfor %}

我可以通过images dict 循环就好了:

{% for k,v in images.items %}
    {{ k }} -- {{ v }}
{% endfor %}

但我需要通过特定的键访问!

【问题讨论】:

  • 您的字典没有名为“x”的元素。
  • "x" 是 dict 的一个键......因为它是一个变量,我该如何让它工作?

标签: python django django-templates


【解决方案1】:

您无法直接执行此操作,但您可以使用自定义模板标签。

请参阅这张旧的 Django 票以获取可能的解决方案,以及该想法被拒绝的原因:Accessing dict values via a value of a variable as key

【讨论】:

  • 哦,好吧,我没有意识到 - 花了太长时间试图让它按照我的方式工作。最后每次都遍历字典以找到密钥。非常感谢@Roodie!
【解决方案2】:

这个聚会很晚了,但这无论如何可能会对某人有所帮助。它不需要模板标签。您可以非常轻松地定义一个类,让 Django 模板语言完成这项工作。

class DotDict( dict):
    def __getattr__( self, attr):
        return self[attr] # or, return self.get( attr, default_value)

这是一个所有方面的字典,除了你不能在上面有用地使用setattr,因为getattr被重新定义为返回与索引它相同的内容。这意味着在 Django 模板中,您可以这样做

{{dotdict.x}}

(如果您不使用.get 提供默认值,模板引擎会捕获 KeyError 并悄悄返回空白字符串)

您可以使用标准dict的init方法将普通dict转换为DotDict

dotdict = DotDict( ordinary_dict)

这在定义渲染上下文时可能很有用。

如果您愿意,您可以从Counter 或其他类似字典的对象而不是普通的dict 继承。

【讨论】:

    猜你喜欢
    • 2013-11-13
    • 2012-04-12
    • 2021-04-10
    • 2014-02-08
    • 1970-01-01
    • 2018-11-15
    • 2021-10-17
    相关资源
    最近更新 更多