mydict = {"key1":"value1", "key2":"value2"}
在Django模板中查找字典值的常规方法是{{mydict。Key1}}, {{mydict。key2}}。如果键是一个循环变量呢?即:
{% for item in list %} # where item has an attribute NAME
{{ mydict.item.NAME }} # I want to look up mydict[item.NAME]
{% endfor %}
mydict.item.NAME失败。如何解决这个问题?
默认情况下你不能。点是属性查找/键查找/切片的分隔符/触发器。
点在模板渲染中有特殊的含义。变量中的点
名称表示查找。具体来说,当模板系统
在变量名中遇到一个点,它会尝试以下查找,
依次为:
字典查找。例如:foo(“酒吧”)
属性查询。例如:foo.bar
List-index查找。例如:foo(酒吧)
但是你可以创建一个过滤器,让你传入一个参数:
https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters
@register.filter(name='lookup')
def lookup(value, arg):
return value[arg]
{{ mydict|lookup:item.name }}
env: 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>
环境:Django 2.2
示例代码:
from django.template.defaulttags import register
@register.filter(name='lookup')
def lookup(value, arg):
return value.get(arg)
我把这段代码放在一个名为template_filters.py的文件中,这个文件位于我的项目文件夹portfoliomgr中
无论你把你的过滤器代码放在哪里,确保你在那个文件夹中有__init__.py
将该文件添加到projectfolder/settings.py文件的templates部分的libraries部分。对我来说,它是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代码中加载库
{%加载template_filters %}