自定义过滤器

  • 当内建过滤器无法满足需求时,需要自定义过滤器
  • 过滤器就是python中的函数,注册后就可以在模板中当作过滤器使用

自定义过滤器演练

  • 需求:

    • 循环到索引为奇数时,html内容背景色为红色
    • 循环到索引为偶数时,html内容背景色为绿色

以下为需求实现步骤

  • 正则匹配urls

      # 自定义过滤器
      url(r'^customfillter/$', views.customfillter),
    
  • 视图

      # 自定义过滤器
      def customfillter(request):
          # 获取数据库书籍列表信息
          bookInfos = BookInfo.objects.all()
          # 构造上下文
          context = {'booklist': bookInfos}
          return render(request, 'Book/customfillter.html', context)
    
  • 自定义返回奇偶数的过滤器

    • 创建python包命名为templatetags

    • 在新建的templatetags包中新建一个py文件

    • 自定义过滤器函数

        # coding: utf-8
      
        # 导入注册模块
        from django.template import Library
      
        # 创建注册对象,命名为register
        register = Library()
      
        # 把以下函数注册成过滤器
        @register.filter
        # 定义求奇偶数的函数
        def mod(num):
            # 如果为偶数返回NO。反之,返回YES
            return num%2
      
  • 模板:需要在模板中使用load标签加载自定义的过滤器

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>自定义过滤器</title>
</head>
<body>

{#加载过滤器#}
{% load customfillter %}

<ul>
{% for book in booklist %}
{% if forloop.counter|mod %}
{#奇数执行的逻辑#}
<li style="background: red">{{ book.name }}</li>
{% else %}
{#偶数执行的逻辑#}
<li style="background: green">{{ book.name }}</li>
{% endif %}
{% endfor %}
</ul>

</body>
</html>

自定义接收多个参数的过滤器

  • 自定义对任意整数求余的过滤器

      @register.filter
      def mod1(num1, num2):
          # 如果余数为0返回NO.反之,返回YES
          return num1%num2
    
  • 使用

    • 变量为第一个参数,3为第二个参数
<ul>
{% for book in booklist %}
    {% if forloop.counter|mod1:3 %}
    {#余数不为0执行的逻辑#}
        <li style="background: red">{{ book.name }}</li>
    {% else %}
    {#余数为0执行的逻辑#}
        <li style="background: green">{{ book.name }}</li>
    {% endif %}
{% endfor %}
</ul>
  • 浏览效果

注意点

  • 1.自定义过滤器的python包,必须命名为templatetags
  • 2.创建注册对象,必须命名为register
  • 3.过滤器的第一个参数就是变量,当有第二个参数时,后面需要使用冒号,最多只能传二个参数