django模板:自定义模板标签,用于显示字典字典

时间:2013-05-12 03:29:28

标签: django templates dictionary

我想在我的模板中执行此操作:

{% for field in form %}
    {{ realNameDict.field.name }}
{% endfor %}

realNameDict是一本字典。上面的代码不起作用。为什么?

修改 在python中,我想我可以这样做:

print realNameDict[field[name]]

非常感谢。

解决方案:

感谢@Calvin Cheng的解释: 诀窍是使用自定义模板标签。

1 /在您的应用程序目录中,创建一个名为templatetags的目录。创建两个文件:__init__.py(保持空白)和extra.py(用于创建自定义模板标记)。

2 /在extra.py中,创建函数以获取字典字典的值:

from django import template
register = template.Library()

@register.filter
def ofKey(value, arg):
    if value:
        return value.get(arg)
    else:
        return ""

3 /在模板中,在内容块中,添加以下行以加载自定义模板标记:

{% load extra %}

4 /在模板中调用自定义模板标记:

{{ realNameDict|ofKey:field.name }}

1 个答案:

答案 0 :(得分:2)

realNameDict不知道field是什么。您期望in循环的模板可以解析字典中的字段值,但realNameDict.field.name的{​​{1}}实际上是文字字段。

<强>解决方案

如果您真的坚持动态解析field,那么诀窍就是编写自定义模板标记。这是一个示例,解决类似(不完全相同)的问题 - Django template object property lookup with a dynamic variable name

在对不同问题的回答中(但与您的问题非常相似),field是一个自定义模板标记函数,可动态解析ofKey中的[variable]

意思是你应该有这样的东西: -

item.[variable]

因为您的for-in循环确实具有{% for field in form %} {{ field|resolve_realNameDict_name }} {% endfor %} 的已解析值,所以您现在可以使用自定义模板标记函数field您当然必须自己编写< / em>)在resolve_realNameDict_name上循环执行for-in循环并将自定义模板标记函数中相应的field值返回到模板中。