如何在Django模板中访问包含连字符的字典键?

10 投票
3 回答
9197 浏览
提问于 2025-04-17 06:58

我们有一个系统,使用的是自定义数据库,里面很多属性的名字里包含了连字符,比如:

user-name
phone-number

这些属性在模板中不能这样访问:

{{ user-name }}

Django会因为这个报错。我不想为了避免这个问题,把所有的键(还有子表的键)都改成下划线。有没有更简单的方法呢?

3 个回答

-1

OrderedDict 字典类型支持使用连字符(-):https://docs.python.org/2/library/collections.html#ordereddict-objects

这似乎是 OrderedDict 实现过程中的一个副作用。注意下面,键值对实际上是作为集合传入的。我敢打赌,OrderedDict 的实现并没有把集合中传入的“键”当作真正的字典键来使用,因此避免了这个问题。

由于这是 OrderedDict 实现的一个副作用,所以你可能不想完全依赖它。不过,它确实可以工作。

from collections import OrderedDict

my_dict = OrderedDict([
    ('has-dash', 'has dash value'), 
    ('no dash', 'no dash value') 
])

print( 'has-dash: ' + my_dict['has-dash'] )
print( 'no dash: ' + my_dict['no dash'] )

结果:

has-dash: has dash value
no dash: no dash value
5

很遗憾,我觉得你可能没什么好运。从文档上来看:

变量名只能由字母(A-Z)、数字(0-9)、下划线或点组成。

8

如果你不想重新组织你的对象,使用自定义模板标签可能是唯一的解决办法。关于如何用任意字符串键访问字典,这个问题的回答提供了一个很好的例子。

对于懒人来说:

from django import template
register = template.Library()

@register.simple_tag
def dictKeyLookup(the_dict, key):
   # Try to fetch from the dict, and if it's not found return an empty string.
   return the_dict.get(key, '')

你可以这样使用:

{% dictKeyLookup your_dict_passed_into_context "phone-number" %}

如果你想用任意字符串名称访问对象的属性,可以使用以下方法:

from django import template
register = template.Library()

@register.simple_tag
def attributeLookup(the_object, attribute_name):
   # Try to fetch from the object, and if it's not found return None.
   return getattr(the_object, attribute_name, None)

你可以这样使用:

{% attributeLookup your_object_passed_into_context "phone-number" %}

你甚至可以想出一种字符串分隔符(比如'__')来处理子属性,不过这个就留给你自己去做了 :-)

撰写回答