zoukankan      html  css  js  c++  java
  • 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,
                               }
                      )
  • 相关阅读:
    【Web】JavaScript 语法入门
    tar 和gzip 的区别
    状态码,好记
    PyCharm与git/GitHub取消关联
    在Ubuntu下安装deb包需要使用dpkg命令
    linux每日命令(4):解压命令
    Python之os.path.join()
    Python的JAVA胶水——jpype
    python之chardet验证编码格式
    python之arrow时间处理模块
  • 原文地址:https://www.cnblogs.com/shuai06/p/12397521.html
Copyright © 2011-2022 走看看