• django 第五课自定义模板过滤器与标签


    • 代码布局:(自定义的代码放在哪里)

      某个app特有的

        app目录下,templatetags文件夹需要放 __init__.py

        在到templetags文件夹下创建python模块(py文件)

    • 定义复用

      创建要给新的app,将他们定义在新的app中,在INSTALL_APPS

      注册,然后可以应用

    自定义模板过滤器

    模板过滤器是什么?
      函数,一个或两个参数
        第一个参数是传递进来的模板变量
        第二个参数,普通的参数,也可以是默认也可以不要
    其实就是个函数,没有什么不同
    在app目录teacher下创建templatetags目录,然后在templatetags文件夹下创建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('male',to_male)

    或者

     1 from django.template import Library
     2 
     3 register = Library()
      #第二种 装饰器注册
    4 @register.filter() 5 def to_male(value,arg='zh'): 6 map = { 7 'zh':('',''), 8 'en':('female','male') 9 } 10 return map[arg][value] 11 12 # register.filter('male',to_male)

    在模板文件index.html中调用需要先load下

    1 {% extends 'teacher/base.html' %}
    2 {% load static %}
    3 #调用自定义过滤器
    4 {% load customer_filters %}
    5 {% block title %}首页面{% endblock %}

    然后通过参数调用

    1             {% for stu in students %}
    2                 <tr {% if stu.sex == ''  %}style="color: red"{% endif %}>
    3                     <td><a href="{% url 'teacher:detail' stu.id %}">{{ forloop.counter }}</a></td>
    4                     <td>{{ stu.name }}</td>
    5                     <td>{{ stu.age }}</td>
    6                     #调用自定义标签
    7                     <td>{{ stu.sex | male }}</td>
    8                 </tr>
    9             {% endfor %}

    还可以调用英文,只需改成如下样式就可以了。

    {{ stu.sex | male:'en'}}
    1             {% for stu in students %}
    2                 <tr {% if stu.sex == ''  %}style="color: red"{% endif %}>
    3                     <td><a href="{% url 'teacher:detail' stu.id %}">{{ forloop.counter }}</a></td>
    4                     <td>{{ stu.name }}</td>
    5                     <td>{{ stu.age }}</td>
    6                     #调用自定义标签
    7                     <td>{{ stu.sex | male:'en'}}</td>
    8                 </tr>
    9             {% endfor %}

    视图views.py设置如下

     1 def index(request):
     2 
     3     students = [
     4         {'id': 10, 'name': '张三', 'age': 18, 'sex': 1},
     5         {'id': 11, 'name': '李四', 'age': 19, 'sex': 0},
     6         {'id': 22, 'name': '王五', 'age': 18, 'sex': 1},
     7         {'id': 138, 'name': '赵柳', 'age': 16, 'sex': 0},
     8         {'id': 90, 'name': '钱七', 'age': 25, 'sex': 1},
     9     ]
    10     return render(request, 'teacher/index.html', context={
    11         'students': students
    12     })

    自定义模板标签

      简单标签

        django.template.Library.simple_tag()

        注册

          1 普通注册

              register.simple_tag(curren_time,name='current')

          2.  装饰器:

              @register.simple_tag(name='current')

      和自定义模板过滤器一样需要在templatetags文件夹下创建customer_tags.py文件,然写如下代码

      

    1 from django.template import Library
    2 from datetime import datetime
    3 register =Library()
    4 #注册第二种方法
    5 @register.simple_tag(name='current')
    6 def curren_time(format_str):
    7     return datetime.now().strftime(format_str)
    8 #注册第一种方法
    9 # register.simple_tag(curren_time,name='current')

    index.html导入

    1 {% extends 'teacher/base.html' %}
    2 {% load static %}
    3 {% load customer_filter %}
    4 {% load customer_tags %}
    5 {% block title %}首页面{% endblock %}
    6 {% block link %} <link href="{% static 'teacher/css/index.css' %}" rel="stylesheet">{% endblock %}
    7 {% block content %}

    index.html 调用

    1 <div class="container">
    2         <h1>当前时间:{% current '%Y-%m-%d %H:%M:%S'%}</h1>
    3       <div class="starter-template">

    效果显示:

     引用上下文变量(views中render传递到模板中的那个context 只需要在

    simple_tag中设置take_context = True)

     customer|_tags.py设置如下

    1 from django.template import Library
    2 from datetime import datetime
    3 register =Library()
    4 #注册第二种方法
    5 @register.simple_tag(name='current',takes_context=True)
    6 def curren_time(context):
    7     return datetime.now().strftime(context['format_str'])
    8 #注册第一种方法
    9 # register.simple_tag(curren_time,name='current')

    views.py中设置

     1 def index(request):
     2 
     3     students = [
     4         {'id': 10, 'name': '张三', 'age': 18, 'sex': 1},
     5         {'id': 11, 'name': '李四', 'age': 19, 'sex': 0},
     6         {'id': 22, 'name': '王五', 'age': 18, 'sex': 1},
     7         {'id': 138, 'name': '赵柳', 'age': 16, 'sex': 0},
     8         {'id': 90, 'name': '钱七', 'age': 25, 'sex': 1},
     9     ]
    10     format_str = '%Y-%m-%d %H:%M:%S'
    11     return render(request, 'teacher/index.html', context={
    12         'students': students,
    13         'format_str':format_str,
    14     })

    index.html中设置

    1 <div class="container">
    2         <h1>当前时间:{% current %}</h1>
    3       <div class="starter-template">
    4         <table class="table">
    5             <thead>
    6             <tr>
    7                 <th>序号</th>

     包含标签:

      django.template.Library.inclution

      通过渲染另外一个模板来展示数据

      定义:

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

        定义一个模板

    customer_tags.py文件设置,用inclutio'n 调用 模板文件

    show_ljist_al_ul.html 文件

      

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

    新疆一个show_ljist_al_ul.html 文件

      

    1 <ul>
    2     {% for l in ls %}
    3         <li>{{ l }}</li>
    4     {% endfor %}
    5 
    6 </ul>

    views.py设置,设置customer_tags中的value值,将课程内容传递过去

     1 def index(request):
     2 
     3     students = [
     4         {'id': 10, 'name': '张三', 'age': 18, 'sex': 1,
     5          'course':['python','java','hack','english']},
     6         {'id': 11, 'name': '李四', 'age': 19, 'sex': 0,
     7          'course':['python','java','hack','english']},
     8         {'id': 22, 'name': '王五', 'age': 18, 'sex': 1,
     9          'course':['python','java','hack','english']},
    10         {'id': 138, 'name': '赵柳', 'age': 16, 'sex': 0,
    11          'course':['python','java','hack','english']},
    12         {'id': 90, 'name': '钱七', 'age': 25, 'sex': 1,
    13          'course':['python','java','hack','english']},
    14     ]
    15     format_str = '%Y-%m-%d %H:%M:%S'
    16     return render(request, 'teacher/index.html', context={
    17         'students': students,
    18         'format_str':format_str,
    19     })

    模板首页index.html调用

     1   <tbody>
     2             {% for stu in students %}
     3                 <tr {% if stu.sex == ''  %}style="color: red"{% endif %}>
     4                     <td><a href="{% url 'teacher:detail' stu.id %}">{{ forloop.counter }}</a></td>
     5                     <td>{{ stu.name }}</td>
     6                     <td>{{ stu.age }}</td>
     7 
     8                     <td>{{ stu.sex | male:'en'}}</td>
     9                     <td>{% show_list_as_ul stu.course%}</td>
    10                 </tr>
    11             {% endfor %}
    12             </tbody>

    效果图:

     传递样式style:

    customer_tags,设置样式参数style

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

    show_ljist_al_ul.html 文件设置具体样式

     1 {% if style == 'button' %}
     2     <div class="list-group">
     3         {% for l in ls %}
     4             <button type="="button" class = "list-group-item"> {{ l }}}</button>
     5         {% endfor %}
     6     </div>
     7 {% elif style == 'link' %}
     8     <div class="list-group">
     9         {% for l in ls %}
    10         <a href="#" class="list-group-item">{{ l }}</a>
    11         {% endfor %}
    12     </div>
    13 {% else %}
    14        <ul class="list-group">
    15         {% for l in ls %}
    16         <a href="#" class="list-group-item">{{ l }}</a>
    17         {% endfor %}
    18     </ul>
    19 {% endif %}

    index.html调用

     1             {% for stu in students %}
     2                 <tr {% if stu.sex == ''  %}style="color: red"{% endif %}>
     3                     <td><a href="{% url 'teacher:detail' stu.id %}">{{ forloop.counter }}</a></td>
     4                     <td>{{ stu.name }}</td>
     5                     <td>{{ stu.age }}</td>
     6 
     7                     <td>{{ stu.sex | male:'en'}}</td>
     8                     <td>{% show_list_as_ul stu.course style='link' %}</td>
     9                 </tr>
    10             {% endfor %}
    11             </tbody>

    效果图:

  • 相关阅读:
    Java读写锁(ReentrantReadWriteLock)学习
    水平拆分和垂直拆分理解(未完)
    MySQL 主从复制
    sharding-JDBC 实现读写分离
    Linux查看程序端口占用情况
    sharding-jdbc 实现分表
    MySQL explain
    MySQL的七种join
    MySQL建立高性能索引策略
    Nginx企业级优化
  • 原文地址:https://www.cnblogs.com/donghao1121/p/10415964.html
Copyright © 2020-2023  润新知