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

    代码布局(自定义的代码,放在哪里)
    1. 某个app特有的
    -app 目录下,templatetags 文件夹,包(包含__init__.py文件)
    -再到 templatetags 文件夹下创建python模块(py文件)
    2. 定义复用
    -创建一个新的app,将他们定义在新的app中,在INSTALL_APPS
    注册,然后就可以应用


    1.自定义模板过滤器
    -模板过滤器是什么
    -函数,一般情况下有一个或两个参数
    - 第一个参数,是传递进来的模板变量,不一定是字符串
    - 第二个参数,普通的参数,也可以是默认,也可以不要
    一般情况下返回一个字符串
    其实就是个函数,没有什么不同
    - 定义非常简单,就是写一个函数
    在项目teacher下建立数据包templatetags,再创建文件customer_filter.py

    -注册
    1.
    通过django.template.Library 它的实例的 filter 方法
    from django.template import Library

    register = Library()

    filter 有两个参数:
    - name 过滤器的名称,是个字符串,可以不写,默认
    使用方法名作为过滤器的名称
    - filter_func 定义的过滤器的函数

    通过自定义过滤器进行性别转换,编辑customer_filter.py

    注册的第一种方法:

    from django.template import Library
    
    register = Library()
    
    def to_male(value,arg='zh'):
    map = {
    'zh':('',''),
    'en':('female','male')
    }
    return map[arg][value]
    
    # register.filter(to_male) #不写名称,只传过滤器函数,默认会使用过滤器名称作为name
    register.filter(name='to_male',filter_func=to_male) #关键字传参

    2.通过装饰器,第二种注册方法

    from django.template import Library
    
    register = Library()
    
    @register.filter(name='male') #传递装饰器名称
    #@register.filter() #不传递装饰器名称,将吧函数名作为默认的name
    def to_male(value,arg='zh'):
        map = {
            'zh':('',''),
            'en':('female','male')
        }
        return map[arg][value]

    -模板中使用
    - 先要在index.html模板中load一下,通过python模块名

    {% extends 'teacher/base.html' %}
    {% load static %}
    {% load customer_filter %} #加载
    ....
    {% block content %}
         <body>
            <table class="table">
                <tr>
                    <th>序号</th>
                    <th>姓名</th>
                    <th>年龄</th>
                    <th>性别</th>
                </tr>
                <tr>
                    {% for stu in student %}
                        <tr {% if stu.sex == 0 %}style="color: red" {% endif %}>
                            <td><a href="{% url 'teacher:detail' stu.id %}">{{ forloop.counter }}</a></td>
                            <td>{{ stu.name }}</td>
                            <td>{{ stu.age }}</td>
                            <td>{{ stu.sex|male:'en' }}</td> #这里的male名称随着上面注册的结果变动
    ....
      </body>
    {% endblock %}

    2.自定义模板标签
    - 简单标签
    django.template.Library.simple_tag()
    - 创建
    普通的python函数,在templatetags下创建一个customer_tag.py

    实例:创建一个输出当前时间的自定义时间。允许传入一个时间格式。

    - 注册
    1.调用函数

    from django.template import Library
    from datetime import datetime
    
    register = Library()
    
    def current_time(format_str):
    return datetime.now().strftime(format_str)
    #注册
    register.simple_tag(current_time,name='current')
    #register.simple_tag(current_time)

    模板中使用:

    {% load customer_tags %}
    
    <h1>当前时间:{% current '%Y-%m-%d %H:%M:%S' %}</h1>

    - 注册
    2.装饰器

    from django.template import Library
    from datetime import datetime
    
    register = Library()
    
    # @register.simple_tag
    @register.simple_tag(name='current')
    def current_time(format_str):
    return datetime.now().strftime(format_str)

    - 引用上下文变量(views中render传递到模板中的那个context)
    只需要在simple_tag 中,设置参数take_context=True

    views.py中添加format_str的定义值

        students = [
       ...
        ]
     
        format_str = '%Y-%m-%d %H:%M:%S'
        return  render(request,'teacher/index.html',context={
            'student':students,
            'format_str':format_str
        })

    修改customer_tag.py

    自定义的标签函数的第一个参数一定是 context(名字不能错)

    @register.simple_tag(name='current',takes_context=True)
    def current_time(context):
    return datetime.now().strftime(context['format_str'])
    
    # register.simple_tag(current_time,name='current',takes_context=True)

    传值以后,模板如下。不需要在前端再传参数

    {% load customer_tags %}
    
    <h1>当前时间:{% current %}</h1>

    结果展示:

    - 包含标签
    通过渲染另外一个模板来展示数据

    -定义
    定义一个函数,接收调用时传递的模板变量

    定义一个模板show_list_as_ul.html

    <ul>
    {% for l in ls %}
    <li>{{ l }}</li>
    {% endfor %}
    </ul>

    customer_tags中添加:

    @register.inclusion_tag('teacher/show_list_as_ul.html')
    def show_list_as_ul(value):
        return {'ls':value}

    views.py中添加course选项:

      students = [
            {'id':10,'name':'tuple','age':18,'sex':1,'course':['python','java','hack','english']},
            {'id':20,'name':'xinlan','age':15,'sex':0,'course':['python','java','hack','english']},
            {'id':30,'name':'xiaopo','age':21,'sex':0,'course':['python','java','hack','english']},
            {'id':40,'name':'gulu','age':19,'sex':1,'course':['python','java','hack','english']},
            {'id':50,'name':'shiwei','age':20,'sex':0,'course':['python','java','hack','english']},
        ]
        format_str = '%Y-%m-%d %H:%M:%S'
        return  render(request,'teacher/index.html',context={
            'student':students,
            'format_str':format_str
        })

    index.html:

        <tr>
                    <th>序号</th>
                    <th>姓名</th>
                    <th>年龄</th>
                    <th>性别</th>
                    <th>课程</th>
                </tr>
                <tr>
                    {% for stu in student %}
                        <tr {% if stu.sex == 0 %}style="color: red" {% endif %}>
                            <td><a href="{% url 'teacher:detail' stu.id %}">{{ forloop.counter }}</a></td>
                            <td>{{ stu.name }}</td>
                            <td>{{ stu.age }}</td>
                            <td>{{ stu.sex|male:'en' }}</td>
                            <td>{% show_list_as_ul stu.course  %}</td>
                        </tr>
                    {% endfor %}
                </tr>

    展示如图所示:

    包含标签接收参数。

    将页面展示进一步进行优化,变成表格进行展示。

    重新定义模板show_list_as_ul.html

    {% if style == 'button' %}
        <div class="list-group">
            {% for l in ls %}
             <button type="button" class="list-group-item">{{ l }}</button>
            {% endfor %}
        </div>
    {% elif style == 'link' %}
        <div class="list-group">
         {% for l in ls %}
          <a href="#" class="list-group-item active">
           {{ l }}
          </a>
        {% endfor %}
        </div>
    {% else %}
        <ul class="list-group">
            {% for l in ls %}
            <li class="list-group-item">{{ l }}</li>
            {% endfor %}
        </ul>
    {% endif %}

    customer_tags中更新如下:

    @register.inclusion_tag('teacher/show_list_as_ul.html')
    def show_list_as_ul(value,style):
        return {'ls':value,'style':style}

    index.html:

        <tr>
                    <th>序号</th>
                    <th>姓名</th>
                    <th>年龄</th>
                    <th>性别</th>
                    <th>课程</th>
                </tr>
                <tr>
                    {% for stu in student %}
                        <tr {% if stu.sex == 0 %}style="color: red" {% endif %}>
                            <td><a href="{% url 'teacher:detail' stu.id %}">{{ forloop.counter }}</a></td>
                            <td>{{ stu.name }}</td>
                            <td>{{ stu.age }}</td>
                            <td>{{ stu.sex|male:'en' }}</td>
                            <td>{% show_list_as_ul stu.course 'button' %}</td>  #传递位置参数
                  {#<td>{% show_list_as_ul stu.course style='button' %}</td>#} #传递关键字参数

    </tr> {% endfor %} </tr>

    页面展示如下:

  • 相关阅读:
    [哈工大操作系统]一、环境配置
    [算法笔记]带权并查集
    C++:Reference to non-static member function must be called
    [算法笔记]并查集
    C++:string.size()比较问题
    [算法笔记]二分总结
    【LeetCode每日一题】2020.10.15 116. 填充每个节点的下一个右侧节点指针
    1Manjaro的安装
    【《你不知道的JS(中卷②)》】一、 异步:现在与未来
    【LeetCode每日一题】2020.7.14 120. 三角形最小路径和
  • 原文地址:https://www.cnblogs.com/taoge188/p/10597785.html
Copyright © 2011-2022 走看看