自定義過濾器和標簽
阿新 • • 發佈:2018-11-24
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>
自定義過濾器和標簽