Answers:
编写自定义模板过滤器:
from django.template.defaulttags import register
...
@register.filter
def get_item(dictionary, key):
return dictionary.get(key)
(我.get
这样使用,如果不存在该键,则不返回任何键。如果执行dictionary[key]
此操作,则将引发一个KeyError
then。)
用法:
{{ mydict|get_item:item.NAME }}
从循环中的字典中获取键和值:
{% for key, value in mydict.items %}
{{ value }}
{% endfor %}
我发现这更容易阅读,并且不需要特殊的编码。无论如何,我通常都需要循环内的键和值。
默认情况下不能。点是属性查找/键查找/切片的分隔符/触发器。
点在模板渲染中具有特殊含义。变量名称中的点表示查找。具体来说,当模板系统遇到变量名称中的点时,它将按以下顺序尝试以下查找:
- 字典查找。示例:foo [“ bar”]
- 属性查询。示例:foo.bar
- 列表索引查找。示例:foo [bar]
但是您可以创建一个过滤器,以便您传递参数:
https://docs.djangoproject.com/zh-CN/dev/howto/custom-template-tags/#writing-custom-template-filters
@register.filter(name='lookup')
def lookup(value, arg):
return value[arg]
{{ mydict|lookup:item.name }}
return value.get(arg)
因为如果键不存在,那不会抛出KeyError异常。
对我来说template_filters.py
,用下面的内容在我的应用程序中创建一个名为python的文件就可以了
# coding=utf-8
from django.template.base import Library
register = Library()
@register.filter
def get_item(dictionary, key):
return dictionary.get(key)
用法就像culebrón所说的:
{{ mydict|get_item:item.NAME }}
register = Library()
呢 它有什么作用 ?
django.template.base.Library
类下注册它。通过register = Library()
实例化该类并在其中使用filter
函数注释器来满足我们的需求。
因为我不能评论,让我做这一个答案的形式:
建立在culebrón的答案或虞姬“富田”富田的答案,传递给函数的字典是一个字符串的形式,因此,也许使用AST。 literal_eval,首先将字符串转换为字典,如本例所示。
通过此编辑,代码应如下所示:
@register.filter(name='lookup')
def lookup(value, arg):
dictionary = ast.literal_eval(value)
return value.get(arg)
{{ mydict|lookup:item.name }}
环境:Django 2.2
from django.template.defaulttags import register
@register.filter(name='lookup')
def lookup(value, arg):
return value.get(arg)
我将此代码放在名为Portfoliomgr的项目文件夹中的一个名为template_filters.py的文件中
无论您将过滤器代码放在何处,都要确保该文件夹中有__init__.py
将该文件添加到projectfolder / settings.py文件中模板部分的库部分。对我来说,它是Portfoliomgr / settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
'libraries':{
'template_filters': 'portfoliomgr.template_filters',
}
},
},
]
在您的html代码中加载库
{% load template_filters %}
环保:django 2.1.7
视图:
dict_objs[query_obj.id] = {'obj': query_obj, 'tag': str_tag}
return render(request, 'obj.html', {'dict_objs': dict_objs})
模板:
{% for obj_id,dict_obj in dict_objs.items %}
<td>{{ dict_obj.obj.obj_name }}</td>
<td style="display:none">{{ obj_id }}</td>
<td>{{ forloop.counter }}</td>
<td>{{ dict_obj.obj.update_timestamp|date:"Y-m-d H:i:s"}}</td>
{{ dict_obj.obj.obj_name }}
在这种情况下,模板代码等效于Python代码dict_obj["obj"]["obj_name"]
,但是问题是关于的等效问题dict_obj[obj][obj_name]
。