转:django自定义标签和过滤器
自定义过滤器
'''定义一个无参数过滤器'''
1:#:在当前的应用中创建一个templatetags的文件夹(必须叫这个名字),然后在文件夹中创建一个python文件,名字随便
2:#在新建的python中引入django模块的template类,然后实例化一个register对象,对象的名字必须是register
from django import template
register = template.Library()#register对象名字不可更改
3:#在新建的python中定义过滤器:
#使用register.filter装饰器装饰函数,就变成一个过滤器,使函数生效
@register.filter
def addhello(arg1):
'''
:param arg1:arg参数是使用过滤器时管道符前面变量的值
:return:返回过滤器处理数据的结果
'''
return arg1+'你好'
4:#在html文件中使用过滤器
'''首先引入写着过滤器的这个python文件,会自动在templatetags的文件夹下找这个文件'''
{% load 文件名 %}#例如:{% load filter %}文件名不用加引号
'''使用过滤器'''
{{ name | addhello }}#addhello是自己定义的一个过滤器,然后返回一个新的值填充
'''*******************************************************************'''
'''定义一个有参过滤器'''
#定义有参过滤器就是在函数中增加一个参数,自定义过滤器函数中最多只能有两个参数
@register.filter
def addhello(arg1,arg2):
'''
:param arg1: 使用过滤器变量的值
:param arg2: 传入的参数,就是管道符后面冒号后面的参数,过滤器最多只能有这两个参数
:return: 返回处理数据后的值
'''
return arg1+arg2
#使用示例:
{{ name | addhello:'你好' }}
自定义标签
#和自定义过滤器一样,在template文件夹中的python中来定义标签,引入方式也相同
@register.simple_tag#register.simple_tag装饰器申明函数是一个自定义标签
def newtag(arg1,arg2):
'''
自定义标签没有参数限制,可以是多个参数,但是使用的时候要一一对应
:param arg1:传入的参数一
:param arg2:传入的参数二
:return:返回处理后的数据
'''
return arg1+arg2
#引用示例:
{% newtag name '世界' %}注意格式:标签使用是{% %}的形式
#第一个参数是要使用的自定义标签的函数名,后面是要传入的参数,函数有几个参数,就传入几个,一一对应
返回HTML片段的标签
##和自定义过滤器一样,在template文件夹中的python中来定义标签,引入方式也相同
#register.inclusion_tag装饰器来申明是一个返回html片段的标签,括号中申明使用的组件
@register.inclusion_tag('index.html')
def res(n1):
'''
参数可以随意设置,使用时要一一对应
标签返回的值必须是字典格式的,键是前端申明的变量名,值就是变量对应的数据
'''
return {'li':[11,22,33]}
引用示例:
{% res %}注意格式:标签使用是{% %}的形式
#返回HTML片段标签的执行流程
'''概念'''
1:在使用组件的时候,如果组件中有for循环这样的逻辑便签,在加载组件的时候,就会查找这个数据
2:如果后台没有返回这个数据,就无法获取变量的值,就不会产生数据,这个时候就可以使用返回HTML片段标签,给组件返回一个值
'''流程'''
1:在页面加载到返回HTML片段标签的时候,就先去标签中生成一个值,
2:值不会直接返回给HTMl页面,而是吧值返回给标签关联的组件,去执行逻辑,渲染组件标签
3:组件标签渲染完成之后,html页面会加载组件,渲染组件产生的标签