Python 如何从Django模板中访问包含连字符的字典键?
我们有一个建立在自定义数据库上的系统,其中许多属性的名称都包含连字符,即:Python 如何从Django模板中访问包含连字符的字典键?,python,django,Python,Django,我们有一个建立在自定义数据库上的系统,其中许多属性的名称都包含连字符,即: user-name phone-number 无法在以下模板中访问这些属性: {{ user-name }} Django为此抛出一个异常。为了解决这个问题,我希望避免将所有键(和子表键)转换为使用下划线。有没有更简单的办法?不幸的是,我想你可能运气不好。从: 变量名必须由任意字母(A-Z)、任意数字(0-9)和 下划线或点 如果不想重新构造对象,则自定义模板标记可能是唯一的方法。对于使用任意字符串键访问字典,的答案
user-name
phone-number
无法在以下模板中访问这些属性:
{{ user-name }}
Django为此抛出一个异常。为了解决这个问题,我希望避免将所有键(和子表键)转换为使用下划线。有没有更简单的办法?不幸的是,我想你可能运气不好。从: 变量名必须由任意字母(A-Z)、任意数字(0-9)和 下划线或点
如果不想重新构造对象,则自定义模板标记可能是唯一的方法。对于使用任意字符串键访问字典,的答案提供了一个很好的示例 对于懒惰的人:
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" %}
您甚至可以为子属性提供某种类型的字符串分隔符(如“u u”),但我将把它留给家庭作业:-)有序字典类型支持破折号: 这似乎是实施有序信息通信技术的副作用。请注意,下面的键值对实际上是作为集合传递的。我敢打赌OrderedDict的实现不会将集合中传递的“key”用作真正的dict key,从而绕过了这个问题 由于这是OrderedICT实施的副作用,因此您可能不希望依赖它。但它是有效的
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
正确的。我还发现了一个类似的问题:我使用了这个解决方案,但将它从标记更改为过滤器。很好用,谢谢!这确实有效,但如何访问包含dict作为值的dict中的密钥?