Django自定义过滤器以及标签

自定义的引入:

内置函数 ---------- 自定义函数
内置模块----------------自定义模块
内置过滤器----------------- 自定义过滤器
内置标签-------------自定义标签

关于自定义:

1-根据一定规则,自己定义出符合需求功能的.
2-用在任何你有需求的地方
3-因为内置的满足不了我们的需求
4-不同的东西有不同的定义规则

文件路径配置:

templates:----------存放模板的目录
templatetags--------存放自定义标签及过滤器的目录

目录结构:

1.在项目目录下 创建个名为templatetags的Python包
在这里插入图片描述
2-在templatetags目录里面创建自定义过滤器及标签文件.
在这里插入图片描述

模板过滤器的分析:

								过滤器: var---变量  'bar'----参数

在这里插入图片描述
自定义过滤器就是一个带有一个或两个参数的Python 函数:

  • (输入的)变量的值 —— 不一定是字符串形式。
  • 参数的值 —— 可以有一个初始值,或者完全不要这个参数。

自定义过滤器的例子:

在common.py文件中自定义cut和lower的过滤器功能

from django import template
register = template.Library()  #必须为这个名字

#第一种方式
#@register.filter(name='myLower')
def myLower(value):
    return value.lower()

#第二种方式
register.filter(name='myLower',filter_func=myLower)

@register.filter
def myCut(value, args):
    return value.replace(args,"")

视图函数views.py中

def test(request):
    name = 'ABCDEFG'
    Str = 'abc tet uuu'
    li = ['java','python','c++','web','math']
    return render(request,'sc_test/test.html',
                  context={
                      'name':name,
                      'Str':Str,
                      'time_format':'%Y年-%m月-%d日 %H时:%M分:%S秒',
                      'li':li,
                  })

路由中urls.py

from django.urls import path
from . import views
urlpatterns = [
    path('test/', views.test,name='test'),

]

templates模板下面的app目录下的test.html HTML文件下:
在这里插入图片描述
效果演示:
在这里插入图片描述

注册自定义过滤器:

django.template.Library.filter()
1.Library.filter()方法需要两个参数:
a. 过滤器的名称(一个字符串对象)
b. 编译的函数 – 一个Python函数(不要把函数名写成字符串)
2.可以把register.filter()用作装饰器;
3.没有声明 name 参数,Django将使用函数名作为过滤器的名字。

#自定义标签:简单标签 包含标签
import datetime
#简单标签注册
@register.simple_tag(name='now_time')
def current_time(time_format):
    return datetime.datetime.now().strftime(time_format)

#上下文 不直接写参数
@register.simple_tag(takes_context=True)
def current_time2(context): #这里参数必须是context 从上下文这里获取
    text = context.get('time_format')
    return datetime.datetime.now().strftime(text)

使用自定义过滤器:

在模板中使用自定义的过滤器
需要使用{% load %}标签将我们的自定义模块加载进来
{% load %} 声明将会载入给定模块名中的标签/过滤器

自定义标签:

简单标签django.template.Library.simple_tag()
包含标签django.template.Library.inclusion_tag()
tag()方法有两个参数:

  1. 模板标记的名称 - 字符串。 如果省略,将使用编译函数的名称。
  2. 编译的函数 – 一个Python函数(不要把函数名写成字符串)
    与过滤器注册一样,也可以将其用作装饰器。

1.定义一个显示当前时间的简单标签,需传入时间格式
2.注册标签时使用takes_context 参数,则可以使用从上下文中传入的参数.
3.模板中使用自定义的标签.
在这里插入图片描述
在这里插入图片描述
效果演示:
在这里插入图片描述

自定义包含标签的例子:

包含标签的功能是可以通过渲染另外一个模板来显示一些数据
例如很多地方都可能会用到下面这几行代码,除了li这个变量不一样之外,其他的都是格式都一样时,那么我们就可以把这部分代码封装在一个包含标签中.

    {% for i in li %}
  • {{ i }}
  • {% endfor %}

1-在app目录下创建一个include_common.html文件(文件名自定义) 存放这部分代码

{% for i in li %}
    <li>{{ i }}</li>
{% endfor %}

2-定义包含标签. 在之前templatetags目录下的commom.py文件下 定义包含标签

@register.inclusion_tag(filename='sc_test/include_common.html') #文件名
def results():
    li = ['java', 'python', 'c++', 'web', 'math']
    return {'li':li} #字典形式

@register.inclusion_tag(filename='sc_test/include_common.html',takes_context=True) #文件名
def results2(context):
    text = context.get('li')
    return {'li':text}

3-使用自定义的包含标签
在这里插入图片描述
效果演示:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42662411/article/details/104552669