叶觉的Django之旅【04-自定义过滤器、简单标签、包含标签】

文件路径配置

说明:为了便于管理,在主目录下创建一个特有的文件夹,以存放整个自定义文件,以下为配置的步骤

  1. 创建 “common” 文件夹,在其中创建 “templatetags” 包,其中“templatetags” 为固定名字。
  2. 把 common 当成一个app在setting.py文件内进行注册
  3. 创建第一个自定义函数存放文件
├── common
│   └── templatetags
│       ├── customize_test.py

实例化一个注册器

过滤器、标签就是为了对传入的信息进行加工展示,给这个“加工的函数”添上一个装饰器,就是所谓的过滤器、标签,而这个添加装饰器的过程通常称之为“注册”。首先实例化一个作为注册器的对象。

# customize_test.py
from django import template

register = template.Library() 	# 万恶之源

自定义过滤器

过滤器实例

  • 定义一个为数据两边加上一堆星星的函数
  • 对星星数量进行控制(带参数的过滤器示例)
# customize_test.py
@register.filter
def add_star(value):
    return '*****'+str(value)+'*****'

# 如果不加入name属性,则过滤器默认以函数名为名
@register.filter(name='add_star2')
def add_star2(value, num):
    return '{}{}{}'.format('*'*num, str(value), '*'*num)

过滤器的引入

  • 在需要进行数据展示的模板进行引用
# 加载
{% load customize_test %}

# 传入一个string:‘ABCDEFG’ 进行测试
{{ string|add_star }} <br>
{{ string|add_star2:10 }} <br>
  • 配置好相应url,引用后效果
    在这里插入图片描述

自定义简单标签

简单标签的实例

  • 标签的引用和注册与上述过滤器相同,只是需要封装的装饰器函数有不同。如下
# 返回当前时间
@register.simple_tag
def current_time():
    return datetime.datetime.now()

# 按格式返回
@register.simple_tag
def current_time2(format_string):
    return datetime.datetime.now().strftime(format_string)
  • 模板中引用示例
{% current_time %}
{% current_time2 '%Y-%m-%d' %}

上下文变量的引用

在自定义过滤器、标签中除了可以对自身接收的参数进行处理,还能获取别的标签或过滤器接收到的值。如下列代码,对上文提到的string值进行了“窃取”,并返回。

@register.simple_tag(takes_context=True)
def get_other(context):
    return context.get('string')

自定义包含标签

功能

包含标签的功能是可以通过渲染另外一个模板来显示一些数据。过程大致如下图所示。
在这里插入图片描述

包含标签的示例

  • 创建待渲染的模板 include_tag_mode1.html
  • 写一个得到一堆数字按键的小功能
{% for i in content %}
    <button>{{ i }}</button>
{% endfor %}
  • 写一个包含标签函数, 对于包含标签的函数,以键值对的形式返回值,供待渲染的模板使用
@register.inclusion_tag('test/include_tag_mode1.html')
def include_mode1():
    return {'content': [i for i in range(10)]}
  • 进行调用
{% include_mode1 %}
  • 于是得到了一串数字按键。
    在这里插入图片描述
  • 使用包含标签进行传值渲染后返回最终结果,在模板的使用中仅仅需要一次调用,这方法拿来写个广告窗口它不香吗?哪里有需求,在哪里调用,避免了一大坨广告代码占位的尴尬 [要恰饭的嘛.jpg]
  • 如需带参数使用包含标签与使用上下文变量,方法与过滤器及简单标签一致,在此不做赘述。

END

发布了24 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_39177678/article/details/103382423