如何在Django模板中访问包含连字符的字典键?
我们有一个系统,使用的是自定义数据库,里面很多属性的名字里包含了连字符,比如:
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" %}
你甚至可以想出一种字符串分隔符(比如'__')来处理子属性,不过这个就留给你自己去做了 :-)