我们已经介绍了Django模板自带的一些常用过滤器(filter)和标签。在实际Web开发项目过程中,这些过滤器可能满足不了我们的需求,这时我们就需要自定义过滤器了。我今天就讲下Django模板过滤器(filter)和标签(tags)的工作原理, 并详细讲解如何自定义模板过滤器和标签。

回顾:模板过滤器(filter)的作用
Django模板中的变量是用双括号如{{ variable }}显示的。通过使用模板过滤器(filter)来可以改变变量在模板中的显示形式,比如{{ article.title | lower }} 中lower过滤器可以让文章的标题转化为小写。Django的模板提供了许多内置过滤器,一些常用的过滤器如下。

过滤器例子

  • lower{{ article.title | lower }} 大小写
  • length{{ name | length }} 长度
  • default{{ value | default: “0” }} 默认值
  • date{{ pub_date | date:”Y-m-d” }} 日期格式

过滤器(filter)的本质和工作原理

  • Django模板过滤器(filter)的本质是一个函数,过滤器的名字就是函数名。
  • 该函数接收竖线” | “前的变量值(value)冒号” : “ 后的参数(args),返回一个值, 其中args可选。
  • 比如lower过滤器接收一个字符串,将其全部转化为小写后返回。
  • date过滤器调用strftime方法将DateTime格式的数据转化为指定格式的字符串返回。

我们自定义过滤器本质就是自定义一个名叫 my_filter_name(value, args) 的函数,用来处理模板中传递过来的变量和参数。
在使用自定义过滤器时时我们需要遵循先载入再使用的原则。

1、自定义模板过滤器filter

1.1、子应用内创建emplatetags的文件夹

自定义的 filters(模板过滤器)和 tags(标签) 会保存在模块名为 templatetags 的目录内。模块文件的名字即稍候你用来加载 filters 或 tags 的名字,所以小心不要采用一个可能与其它应用自定义的 filters 或 tags 冲突的名字。

在该目录下你还要新建一个python文件专门存放你自定义的 filters(模板过滤器) 和 tags(标签),本例中这个python文件取名为blog_extras.py,当然你也可以取其它名字。你的应用布局可能看起来像这样:整个目录结构如下所示:

  1. user/
  2. __init__.py
  3. models.py
  4. templatetags/
  5. __init__.py
  6. blog_extras.py
  7. views.py

先举个例子,在过滤器 {{ var|foo:”bar” }} 中,变量 var 和参数 bar 会传递给过滤器 foo
在模板中使用自定义的过滤器(filter)时,
需要先使用 {% load blog_extras %} 载入自定义的过滤器,
然后通过使用 {{ variable | my_filter_name }} 使用。

1.2、创建存放自定义模板过滤器 和 自定义标签的 py文件

这是一个自定义过滤器,定义的例子:

  1. from django import template
  2. register = template.Library()
  3. @register.filter
  4. def cut(value, arg): # 需要传递两个参数的情况
  5. """从给定的字符串中 移除所有 arg 的值"""
  6. return value.replace(arg, '')

这个例子展示了如何使用这个过滤器:

  1. {% load blog_extras %}
  2. <h1>{{ somevariable|cut:"0" }}<h1>

大部分的过滤器并没有参数。这样的话,只需要把这些参数从你的函数中去掉就好。例子如下:

  1. from django import template
  2. register = template.Library()
  3. def lower(value): # 只有一个参数的情况
  4. """Converts a string into all lowercase"""
  5. return value.lower()

这个例子展示了如何使用这个过滤器:

  1. {% load blog_extras %}
  2. <h1>{{ somevariable|cut }}<h1>

2、自定义标签

同自定义模板过滤器filter 同步骤,创建文件夹->在文件夹下创建 py文件

2.1、子应用内创建emplatetags的文件夹

2.2、创建存放自定义模板过滤器 和 自定义标签的 py文件

创建简单标签

  1. from django import template
  2. from .. import models
  3. register = template.Library()
  4. @register.simple_tag
  5. #创建简单标签
  6. def article_count1(article_id):
  7. print(article_id)
  8. result = models.Article.objects.filter(category_id=article_id)
  9. count = int(result.count())
  10. return {"count": count}

自定义标签的使用

先使用 {% load py文件名 %} 载入自定义的过滤器、标签
在模板中使用自定义标签的语法 {% 标签名字 参数1 参数2 … %}

随后在模板中使用自定义标签例子:

  1. {% load myfilter %}
  2. {% my_tag 1 %}

3、参考博客

参考官网
https://docs.djangoproject.com/zh-hans/2.2/howto/custom-template-tags/

如何自定义Django的模板过滤器(filter)和标签
https://zhuanlan.zhihu.com/p/45184459

https://www.cnblogs.com/gaoyuxia/p/12421257.html