自定义过滤器
- 当内建过滤器无法满足需求时,需要自定义过滤器
- 过滤器就是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.过滤器的第一个参数就是变量,当有第二个参数时,后面需要使用冒号,最多只能传二个参数