zoukankan      html  css  js  c++  java
  • Django模板—-自定义过滤器和标签

    一、filter和simple_tag

    1、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.

    2、在app中创建templatetags模块(模块名只能是templatetags)

    3、创建任意 .py 文件,如:my_tags.py

    from django import template
    from django.utils.safestring import mark_safe

    # mark_safe 设置数据安全不转义 register
    = template.Library() #register的名字是固定的,不可改变 @register.filter def filter_multi(v1,v2): return v1 * v2 <br> @register.simple_tag def simple_tag_multi(v1,v2): return v1 * v2 <br> @register.simple_tag def my_input(id,arg): result = "<input type='text' id='%s' class='%s' />" %(id,arg,) return mark_safe(result)

    4、在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py

    {% load my_tags %}   # load 会循环找所有app下的templatetags下的文件

    5、使用simple_tag和filter(如何调用)

    --.html
    {# 先导入我们自定义filter那个文件 #}
    {% load xxx %}  
          
    # num=12
    {# 使用我们自定义的filter #}
    {{ num|filter_multi:2 }} # 24
     
    {{ num|filter_multi:"[22,333,4444]" }}
     
    {% simple_tag_multi 2 5 %}  参数不限,但不能放在if for语句中
    {% simple_tag_multi num 5 %}

    注意:filter可以用在if等语句后,simple_tag不可以

    {% if num|filter_multi:30 > 100 %}
        {{ num|filter_multi:30 }}
    {% endif %}
    
    

    二、inclusion_tag

    多用于返回html代码片段

    先理解include标签,

    include 标签

      • {% include %} 标签允许在模板中包含其它的模板的内容。
      • 下面这个例子都包含了 nav.html 模板
        {% include "nav.html" %}
    include标签,定义的模板数据是死的只有模板内容;而过滤器和自定义标签是定义数据的。@register.inclusion_tag可以将这两者结合在一起。
    还是在
    templatetags下的文件中:
    web.py:
    from django.template import Library
    import re
    register =Library()
    
    @register.inclusion_tag("rbac/menu.html")
    def get_menu_styles(request):
        permission_menu_list = request.session.get("permission_menu_list")
        for item in permission_menu_list:
            if re.search("^{}$".format(item["url"]), request.path):
                item["class"] = "active"
    
        return {"permission_menu_list":permission_menu_list}

    数据会先交给rbac/menu.html渲染,再以字符串形式返回;谁调用就传给谁

    rbac/menu.html:

    <div class="static-menu">
    
            {% for item in permission_menu_list %}
                <a href="{{ item.url }}" class="{{ item.class }}">
                    <span class="icon-wrap"><i class="fa {{ item.icon }}"></i></span> {{ item.title }}
                </a>
            {% endfor %}
    
    </div>

    可以直接返回渲染后的数据,且解决了代码的复用性,谁用直接调就行

    调用::

    layout.html :

     {% load web %}  <!--调用-->
     {% get_menu_styles request %}

    实例:

    点击标签加入active样式:
         
            解决思路1:
                每一个返回母版的视图函数中:
                    permission_menu_list = request.session.get("permission_menu_list")
                    for item in permission_menu_list:
                        if re.search("^{}$".format(item["url"]), request.path):
                            item["class"] = "active"
                
            解决思路2:    引入inclusion_tag方法:
                    @register.inclusion_tag("rbac/menu.html")
                    def get_menu_styles(request):
                        permission_menu_list = request.session.get("permission_menu_list")
                        for item in permission_menu_list:
                            if re.search("^{}$".format(item["url"]), request.path):
                                item["class"] = "active"
    
                        return {"permission_menu_list":permission_menu_list}
                
                
                在layout.html中:
                         <div class="menu-body">
                
                               {% load web %}
                               {% get_menu_styles request %}
    
                        </div>
     



  • 相关阅读:
    卧槽!缓存的问题太多了(雪崩、击穿、穿透…)一个个解决!
    Java 命名规范(非常全面,可以收藏)
    一次接口超时排查,花费了我两个星期。。
    LiveGBS和海康威视
    SQLite文件存储和读取
    Vue页面刷新原理:Cesium刷新机制
    MBtiles格式数据
    gitee:403错误
    uniapp是什么?
    HBuilderx怎么运行代码
  • 原文地址:https://www.cnblogs.com/zwq-/p/10010053.html
Copyright © 2011-2022 走看看