当尝试在模板中调用以下划线开头的对象时,会报如下类似错误:
TemplateSyntaxError at /
Variables and attributes may not begin with underscores: 'user._meta.get_field('name').help_text'
解决方法就是,将调用以下划线开头的对象的操作封装到模板过滤器中。
如何创建自定义模板过滤器
在 models.py 文件所在目录新建一个 templatetags 目录:
hello/
models.py
templatetags/
hello_extras.py
__init__.py
views.py
hello_extras.py 中保存着我们自定义的模板过滤器。
在 hello_extras.py 文件的开头需要包含如下代码:
from django import template
register = template.Library()
本例中我们将定义一个 help_text 过滤器,用于获取 models 中字段的 help_text 的值,所以 hello_extras.py 的内容为:
from django import template
register = template.Library()
@register.filter
def help_text(value, arg):
return value._meta.get_field(arg).help_text
在模板中使用自定义过滤器时,要记得导入过滤器:
{% load hello_extras %}
本例的模板文件:
{% load hello_extras %}
{% for user in users %}
<p>{{ user|help_text:"name" }}: {{ user.name }}</p>
{% endfor %}
models 文件节选:
class User(models.Model):
name = models.CharField(max_length=50, help_text=u'姓名')
模板渲染结果:
姓名:tom
姓名:jim
姓名:eric
测试项目下载:mysite.tar.gz ,测试环境:django 1.4.3。
Comments