自定义的引入:
内置函数 ---------- 自定义函数
内置模块----------------自定义模块
内置过滤器----------------- 自定义过滤器
内置标签-------------自定义标签
关于自定义:
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()方法有两个参数:
- 模板标记的名称 - 字符串。 如果省略,将使用编译函数的名称。
- 编译的函数 – 一个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-使用自定义的包含标签
效果演示: