zoukankan      html  css  js  c++  java
  • Django——5 自定义过滤器及标签

    Django

    1. 自定义过滤器
    2. 自定义标签
      1. 简单标签
      2. 包含标签

    自定义过滤器

    自定义过滤器就是一个带有一个或两个参数的Python 函数:

    • - (输入的)变量的值 —— 不一定是字符串形式。
    • - 参数的值 —— 可以有一个初始值,或者完全不要这个参数。

    注册自定义过滤器

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

    首先需要新建一个包,以APP的形势存在(加入到INSTALLED_APPS中),例如新建一个comment的包(就是一个comment的文件夹,里面包含一个init的py文件)

    然后在里面新建一个包,固定名字为templatetags,在里面新建一个py文件(自定义)

    在settings中添加

    my_filter中:定义了一个replace得过滤器,还有一个title得过滤器

    from django import template
    register = template.Library()
    
    @register.filter()
    def my_cut(value, arg):
        return value.replace(arg, '') 
    
    
    @register.filter # 这个括号可以不加,还可以在括号里面重命名方法名
    def my_capfirst(value):
        return value.title()

     views中:

    from django.shortcuts import render
    
    
    def diy_filter(request):
        return render(request, 'DIY/diy.html', context={
            'string': 'hello django',
        })

    定义好url路径和视图,在html中:

    {% load my_filter %}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>自定义内容</title>
        <style>
        </style>
    </head>
    <body>
    <p>{{ string }}</p>
    <p>django自带的首字母大写:{{ string|capfirst }}</p>
    <p>自定义的首字母大写:{{ string|my_capfirst }}</p>
    <p>django自带的cut:{{ string|cut:' ' }}</p>
    <p>自定义的cut:{{ string|my_cut:' ' }}</p>
    </body>
    </html>

     


    自定义标签

    • 简单标签    django.template.Library.simple_tag()
    • 包含标签    django.template.Library.inclusion_tag()

    tag()方法有两个参数:

    • 模板标记的名称 - 字符串。 如果省略,将使用编译函数的名称。
    • 编译的函数 – 一个Python函数(不要把函数名写成字符串)与过滤器注册一样,也可以将其用作装饰器。

     

    自定义简单标签

    urls路径一样,视图添加一个时间格式

    views:

    from django.shortcuts import render
    
    
    def diy_filter(request):
        return render(request, 'DIY/diy.html', context={
            'string': 'hello django',
            'time_format': '%Y年%m月%d日 %H:%M:%S',
        })

     my_filter:

    from django import template
    from datetime import datetime
    register = template.Library()
    
    # 自定义标签
    # 简单标签
    @register.simple_tag
    def current_time():
        time_format = '%Y年%m月%d日 %H:%M:%S'
        return datetime.now().strftime(time_format)
    
    @register.simple_tag
    def current_time1(time_format):
        return datetime.now().strftime(time_format)
    
    # 简单标签+上下文
    @register.simple_tag(takes_context=True)
    def current_time2(context):
        time_format = context.get('time_format')
        return datetime.now().strftime(time_format)

     html中:

    {% load my_filter %}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>自定义内容</title>
        <style>
        </style>
    </head>
    <body>
    <p>方法里面传参:{% current_time %}</p>
    <p>页面直接传参:{% current_time1 '%Y年%m月%d日 %H:%M:%S' %}</p>
    <p>上下文传参:{% current_time2 %}</p>
    </body>
    </html>

     

     自定义包含标签

    包含标签的功能是可以通过渲染另外一个模板来显示一些数据
    例如很多地方都可能会用到下面这几行代码,除了choices这个变量不一样之外,其他的都是格式都一样时,那么我们就可以把这部分代码封装在一个包含标签中.
    <ul>
        {% for i in choices %}
            <li>{{ i }}</li>
        {% endfor %}
    </ul>

    定义一个show_tags的html文件

    % for foo in choice %}
        <li>foo</li>
    {% endfor %}

     在views中添加一个列表:

    from django.shortcuts import render
    
    
    def diy_filter(request):
        return render(request, 'DIY/diy.html', context={
            'list':['apple', 'pear', 'orange'],
        })

    my_filter中:

    from django import template
    from datetime import datetime
    register = template.Library()
    
    # 包含标签
    @register.inclusion_tag('DIY/show_tags.html')
    def tags1():
        li = ['a', 'b', 'c']
        return {'choice': li}
    
    @register.inclusion_tag('DIY/show_tags.html')
    def tags2(li):
        return {'choice': li}
    
    @register.inclusion_tag('DIY/show_tags.html', takes_context=True)
    def tags3(context):
        return {'choice': context.get('list')}

     html中

    {% load my_filter %}
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>自定义内容</title>
        <style>
        </style>
    </head>
    <body>
    <p>方法里面传参:{% tags1 %}</p>
    <p>content里面传参:{% tags2 list %}</p>
    <p>上下文传参:{% tags3 %}</p>
    </body>
    </html>

     

  • 相关阅读:
    ECharts图形库
    python_flask 注册,登陆,退出思路 ---纯个人观点
    python基础-类的继承
    python基础-面向对象
    python基础-大杂烩
    python基础-异常处理
    python基础-文本操作
    python基础-模块
    python基础-函数
    python基础-字典
  • 原文地址:https://www.cnblogs.com/pywjh/p/10175119.html
Copyright © 2011-2022 走看看