在Django模板中访问带有前导下划线的dict元素

时间:2012-12-03 23:50:02

标签: python django elasticsearch

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

my_dict = {"_source": 'xyz'}

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

我无法使用{{my_dict._source}}在Django模板中访问上述dict,所以我假设Django正在阻止它。那是准确的吗?

我有点希望Django能够使用以下划线开头的变量,比如仍然在进行dict查找(首先应该是尝试),但拒绝进行属性查找,方法调用和列表索引查找,因为强调的前缀变量会无效。我很快就失去了希望。

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

2 个答案:

答案 0 :(得分:15)

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" }}

答案 1 :(得分:0)

就我而言,如果我知道dict元素,而且它只有一个,我更喜欢使用pop重命名dict键:

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

这样,我在dict上获得了一个新名称,并且我可以毫无问题地访问模板。