Django学习笔记之自定义过滤器及标签

目录结构:

在项目目录下 创建个名为common的Python包
这里写图片描述
将common加入到settings文件中的INSTALLED_APP列表中

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions', #
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'book.apps.BookConfig',
    'common',  #相当于是一个进行注册了的app
]

在common里面创建目录templatetages,在目录里面创建自定义过滤器及标签文件.
这里写图片描述
**注意:**templatetags这个目录名字是固定的,而里面的模块名是自定义的
在common_extras.py文件中自定义cut和lower的过滤器功能
一.自定义过滤器

# cut 过滤器的功能
def mycut(value,arg):
    return value.replace(arg,'')
# 对mycut进行注册
register.filter('mycut',mycut)

注册自定义过滤器:

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

例子:

from django import template
register = template.Library() #实例化
# 对mycut进行注册
register.filter('mycut',mycut)

# 装饰器 进行注册
@register.filter
def mylower(value):
    return value.lower()

使用自定义过滤器:

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

二.自定义标签
1.简单标签django.template.Library.simple_tag()
2.包含标签django.template.Library.inclusion_tag()
tag()方法有两个参数:
1. 模板标记的名称 - 字符串。 如果省略,将使用编译函数的名称。
2. 编译的函数 – 一个Python函数(不要把函数名写成字符串)
与过滤器注册一样,也可以将其用作装饰器。

自定义简单标签的例子:
1.定义一个显示当前时间的简单标签

@register.simple_tag
def current_time():
    return datetime.datetime.now().strftime('%Y年%m月%d日  %H:%M:%S')

2.简单标签,传参数,,需传入时间格式

# 简单标签 传参数
@register.simple_tag
def current_time2(format_string):
    return datetime.datetime.now().strftime(format_string)

3.注册标签时使用takes_context 参数,则可以使用从上下文中传入的参数.

# 从上下文中传进来参数
@register.simple_tag(takes_context=True)
def current_time3(context):
    format_string = context.get('format_string')
    return datetime.datetime.now().strftime(format_string)

3.模板中使用自定义的标签
这里写图片描述

自定义包含标签的例子:
1.包含标签的功能是可以通过渲染另外一个模板来显示一些数据

#例如很多地方都可能会用到下面这几行代码,除了choices这个变量不一样之外,其他的都是格式都一样时,那么我们就可以把这部分代码封装在一个包含标签中.
# music/show_tags.html
<ul>
    {% for i in choices %}
        <li>{{ i }}</li>
    {% endfor %}
</ul>
@register.inclusion_tag('music/show_tags.html')
def show_result():
    ls = ['xxx','yyy','zzz']
    return {'choice':ls}

2.包含标签 模板里面传参

@register.inclusion_tag('music/show_tags.html')
def show_result2(choice):
    # ls = ['xxx','yyy','zzz']
    return {'choice':choice}
模板里面传参: {% show_result2 ls %}

3.包含标签 上下文传参

@register.inclusion_tag('music/show_tags.html',takes_context=True)
def show_result3(context):
    ls = context.get('ls')
    return {'choice':ls}

视图函数(通过上下文传参的参数在这里):

def index5(request):
    return render(request, 'music/index5.html',
                  context={'test':'Abc Def Ghi',
                           'format_string':'%Y/%m/%d   %H:%M:%S',
                           'ls':ls,
                           }
                  )
posted @ 2018-08-02 13:14  此时相望不相闻  阅读(116)  评论(0编辑  收藏  举报