【问题标题】:Accessing dict elements with leading underscores in Django Templates在 Django 模板中使用前导下划线访问 dict 元素
【发布时间】:2012-11-21 13:07:17
【问题描述】:

我正在尝试使用以下划线字符开头的键访问 dict 的元素。例如:

my_dict = {"_source": 'xyz'}

我正在尝试在 Django 模板中访问它们。显然,我意识到您无法从 Django 模板访问带下划线的 Python 变量(因为它们在 Python 中被认为是私有的),但这是一个 dict 对象,其中任何不可变对象都是有效键。

我无法使用 {{ my_dict._source }} 在 Django 模板中访问上述字典,所以我认为 Django 正在阻止它。那准确吗?

我有点希望 Django 对以下划线开头的变量做一些理智的事情,比如仍在进行 dict 查找(第一件事应该是尝试),但拒绝进行属性查找、方法调用和列表索引查找,因为带下划线的前缀变量会无效。不过我很快就失去了希望。

为了记录,我知道有人会建议只更改字典,但这实际上是在 ElasticSearch 实例上执行 REST API 请求时由 rawes 库返回的多级字典。

【问题讨论】:

  • 如果这确实是 django,你可以创建一个自定义模板标签来返回私有变量。
  • “django 模板下划线变量”的谷歌搜索显示:groups.google.com/forum/?fromgroups=#!topic/django-users/… - 即,是的,您需要创建一个自定义模板标签。虽然这个线程很旧,但我怀疑功能已经改变。
  • 它不是私有变量,它是一个完全合法的 dict 键,应该可以通过 dict 查找访问。真的试图避免制作模板标签。特别是因为 dict 对象可以像 {{ my_dict.hits._source._text }} 一样深入。

标签: python django elasticsearch


【解决方案1】:

The docs mention 不能让变量以下划线开头:

变量名称必须由任意字母 (A-Z)、任意数字 (0-9)、下划线(但不得以下划线开头)或点组成。

但您可以轻松编写custom template filter 来模仿字典的get 方法:

@register.filter(name='get')
def get(d, k):
    return d.get(k, None)

{{ my_dict|get:"_my_key" }}

【讨论】:

【解决方案2】:

在我的情况下,如果我知道 dict 元素,而且它只有一个,我更喜欢使用 pop 重命名 dict 键:

my_dict['new_key'] = my_dict.pop('_old_key')

这样我在字典上得到了一个新名字,我可以毫无问题地在模板中访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-18
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    相关资源
    最近更新 更多