1. 程式人生 > >自定義過濾器和標簽

自定義過濾器和標簽

html渲染 nod inpu orm list r語 -- 允許 過濾器

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
 
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
{% load xxx %}  
      
# num=12
{{ 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 %}
6.@register.inclusion_tag:

先理解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>

 



自定義過濾器和標簽