Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从Django模板中访问包含连字符的字典键?_Python_Django - Fatal编程技术网

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中的密钥?