前言
![8491383-59a0fe9fc9b78437.png](https://i-blog.csdnimg.cn/blog_migrate/2afd70e55b22bad8234bcef0aec20df7.webp?x-image-process=image/format,png)
页面中有很多数据是固定的:最新文章、归档、分类这些基本是每个页面都有的,这些数据如果都从视图中获取就很耗时,而且增加了很多重复代码,好在Django中提供了自定义模板标签的方法,让我们可以和原生标签一样方便使用。
![8491383-de535fc7998e8057.png](https://i-blog.csdnimg.cn/blog_migrate/e7039182998ae32e14d1f50c9eddc876.webp?x-image-process=image/format,png)
Django模板标签(tags)的分类
Django的模板标签(tag)一共分2类:
simple_tag (简单标签 : 处理数据,返回一个字符串或者给context设置或添加变量。
inclusion_tag (包含标签) : 处理数据,返回一个渲染过的模板。
熟悉Django的都知道,我们一般在视图view里设置context,然后通过它来传递数据给模板。 一个context是一系列变量和它们值的集合。通过使用simple_tag, 我们可以在视图外给context设置或添加变量。注: Django 1.9以后不再支持assignment_tag了,均使用simple_tag。
自定义模板标签
1 创建文件
django使用自定义模板标签是有一系列操作的,不能随意使用。首先我们要在应用app下新建一个文件夹,并创建一个init.py文件,这个文件夹就可以作为一个包使用了,然后新建一个.py文件用于存放模板标签的逻辑代码,由于我这个应用是blog,所以新建了blog_tags.py,名字是可以随便起的,方便自己理解就好。
![8491383-4404fb53e2f70d1b.png](https://i-blog.csdnimg.cn/blog_migrate/dca48baf386b4a5b39fe235ff8342e6e.webp?x-image-process=image/format,png)
2 编写代码
进入blog_tags.py,就可以写自己的逻辑函数了,比如我要获取最新的5个文章,只需要返回一个列表就可以。
![8491383-6a03ee32564c92b2.png](https://i-blog.csdnimg.cn/blog_migrate/ffdf4147cb05d6eb87b1ab15d9aca79d.webp?x-image-process=image/format,png)
我的文章类是Post,所以就从模型中引入了Post类。
-
编写函数,返回Post列表,并用切片取出前5个数据,直接获取的时候是从最早发布的文章到最新发布的文章这样顺序返回的列表,由于我在Post类中的Meta中指定了order_by是根据创建时间逆序排列的,所以本函数返回的就是最新的5条数据了。
Post类的Meta - 导入template模板包
- 实例化一个Libraty类
- 给函数加上@register.simple_tag装饰器,这样函数就作为模板标签可以被前端使用了。
3 使用
首先要在.html最上方声明标签文件,然后才能使用
![8491383-93861c584eedf1fd.png](https://i-blog.csdnimg.cn/blog_migrate/5b9c4dff71760b17fe4d886b91aa45fb.webp?x-image-process=image/format,png)
[图片上传中...(image.png-da66f5-1550814952384-0)]
最后就可以引用了
![8491383-d3ddd83b80e09418.png](https://i-blog.csdnimg.cn/blog_migrate/fac9379e422540848a56e60e37dc7822.webp?x-image-process=image/format,png)
通过使用 get_recent_posts 模板标签获取到最新文章列表,然后通过 as 语法(Django 模板系统的语法)将获取的文章列表保存进了 recent_post_list 模板变量中,之后就可以通过 for 循环来循环显示文章列表数据了