一、创建存放目录,也可放在app中
①在项目目录下创建common的python包
②再在common包目录下创建templatetags包,其中templatetags这个命名是固定的
这个目录可存放自定义的过滤器及标签,目录如下图所示:
③注册common这个包,在settings.py中:
INSTALLED_APPS = [
'common',
]
二、自定义模板过滤器
①在templatetags目录下,创建my_filters.py文件
②在my_filters.py中添加如下代码
from django import template
# register名称固定
register = template.Library()
@register.filter # @register.filter():括号中可指定过滤器名称
def my_lower(value):
return value.lower()
@register.filter # 针对有参数的过滤器
def my_cut(value, arg):
return value.replace(arg, '')
③在student app目录下的views.py中创建视图函数test
④在student app目录下的urls.py中设置如下路由
from django.urls import path
from . import views
app_name = 'student'
urlpatterns = [
path('test/', views.test, name='test'),
]
⑤创建模板test.html,注意要先load my_filters这个自定义的py文件
⑥访问查看效果,如下图所示,跟自带的效果是一致的!!!也可以根据需求创建不同功能的过滤器
三、自定义模板标签
在templatetags目录下创建一个my_tags.py的文件用来存放
- 自定义简单标签
from django import template
from datetime import datetime
register = template.Library()
@register.simple_tag
def current_time1(): # 不用传参,可直接用
format_string = '%Y年%m月%d月 %H:%M:%S'
return datetime.now().strftime(format_string)
@register.simple_tag # 针对传参的模板
def current_time2(format_string):
return datetime.now().strftime(format_string)
@register.simple_tag(takes_context=True) # 从上下文中获取参数
def current_time3(context): #context名称固定
format_string = context.get('format_string')
return datetime.now().strftime(format_string)
针对第三种从上下文中获取参数,那么在对应的视图函数中就得添加这个参数
在模板中引用模板标签,需先load my_tags
效果如下图所示,三个效果都是一样的:
- 自定义包含标签
①当我们很多模板中需要用到一些类似的逻辑功能时,就可以用包含标签进行封装
先创建模板用来存放功能代码,在student/show_tags.html
②在my_tags.py中添加如下代码
# 添加创建好的模板文件
@register.inclusion_tag('student/show_tags.html')
def show_list1():
menu = ['python', 'java', 'c++']
return {'choices': menu}
@register.inclusion_tag('student/show_tags.html')
def show_list2(menu):
return {'choices': menu}
@register.inclusion_tag('student/show_tags.html', takes_context=True)
def show_list3(context):
menu = context.get('menu')
return {'choices': menu}
③针对上下文中获取参数传值
④在test.html中添加如下代码:
{% load my_tags %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<body>
{% show_list1 %}
<hr>
{% show_list2 menu %}
<hr>
{% show_list3 %}
</body>
</html>
⑤查看结果
只需知道基本使用即可,一般用不到!!!