自定义标签
1.建立项目,app的不说。只要在随意一个app中建立上文提到的templatetags文件夹。
这里是有点不理解的地方,在任意一个app建立的tags别的app能够使用吗?起初对此很疑惑。以为在一个app下建立的tags就这一个app能使用。为了大家都能够使用自己定义的tags,我还想把templatetags单独拿出来,跟普通app在项目当中是平级地位。这种思路搞了很久发现行不通。无奈只好打算使用copy在每一个app都复制一份templatetags。(当然这只是我起初的错误想法)但后来发现,居然一个app中有,其他的app中就可以直接使用此自定义的文件了。只需要在需要的模板当中(不管模板是在你的那个app中)调用load语句将自定义的文件load进来便可以。
随后看了看一些文档,只要templatetags所在位置是settings.py中INSTALLED_APPS中配置过的,或是在TEMPLATE_DIRS配置过的,任意一个位置便可以。
一定记得要在templatetags文件夹中包含__init__.py文件。空文件便可。
Django编译一个模板时,它将原始模板分成一个个 节点 。每个节点都是 django.template.Node 的一个实例,并且具备 render() 方法。 于是,一个已编译的模板就是 节点 对象的一个列表。 例如,看看这个模板:
被编译的模板表现为节点列表的形式:
- 文本节点: "Hello, "
- 变量节点: person.name
- 文本节点: ".\n\n"
- IfEqual节点: name.birthday和today
当你调用一个已编译模板的 render() 方法时,模板就会用给定的context来调用每个在它的节点列表上的所有节点的 render() 方法。 这些渲染的结果合并起来,形成了模板的输出。 因此,要自定义模板标签,你需要指明原始模板标签如何转换成节点(编译函数)和节点的render()方法完成的功能 。
classUpperNode(template.Node): 继承template.Node类
def __init__(self,nodelist):
self.nodelist=nodelist
def render(self, context): 调用render处理方法
content = self.nodelist.render(context) 用render处理context
return content.lower() 将作用与节点当中的内容,不仅仅是变量
def upper(parser, token):
第一个参数是模板内容,第二个参数是参数列表 nodelist = parser.parse("endupper") 取节点当中的内容
parse.delete_first_token() 删除第一个参数,因为第一个参数是自己的名字upper
renturn UpperNode(nodelist) 传递到UpperNode当中
{%load upper %}
{% upper %}
{% endupper %}