1、Django流程图
2、自定义标签、过滤器的作用:
在使用django时经常会遇到一种情况,就是从视图view中传递给模板template的值需要再进一步处理才能在模板中使用,但是模板中是不能运行python语句的,比如遇到下面的问题:
视图传递了一个变量node.id给模板,模板需要根据这个值去跟数据库进行交互,得出的结果来为前端html中的<span>标签的class属性赋值,如果结果为True,则赋值class='folder exp1',否则赋值为class='file exp1'。因为视图传递给模板的变量还需要处理,需要与数据库进行交互后得出结果,而这部分功能在html中是无法执行的。
那么怎么处理呢,这时就需要用到自定义标签和过滤器了。把参数传递给自定义标签中的过滤器,在过滤器中完成与数据库的交互过程,最后返回一个值即可。
3、自定义标签使用
1. 在某个app下创建一个名为templatetags(必需,且包名不可变)的包,再在此包下新建一个py文件,这个py文件就是你的自定义标签文件如下rbac.py,目录如下:
2.在settings文件中的INSTALLD_APPS内添加APP的名字,比如我的AP名字为rbvc,则在settings.py中添加rbvc,如下:
3.在rbac.py文件中写过滤器judgefileorfolder
from django import template
from web.models import *
register = template.Library()
@register.filter(name='judgefileorfolder')
def judgefileorfolder(value):
def get_upper_business(objects):
return Business_detail.objects.get(id=objects.upper_business)
objects=Business_detail.objects.get(id=value)
try:
for i in range(3):
objects=get_upper_business(objects)
if not objects.upper_business:
sign = False
else:
sign = True
except:
sign=True
return sign
自定义过滤器:
- 自定义过滤器就是写一个函数
- 使用过滤器器时把值传入该函数
- 函数完成后,需要进行注册register,并返回值到模板
4.在模板中调用自定义标签和过滤器
{% load rbac %} <!-- 载入自定义标签 -->
<style type="text/css">
.exp1{font-size:15px;}
</style>
<li><span id="business_{{ node.id }}" {% if node.id|judgefileorfolder %} class="folder exp1"
{% else %} class="file exp1"
{% endif %}> {{ node.name }} </span> <!-- 渲染当前遍历的节点 -->
{% if node.id|getNextBusiness %} <!-- 通过过滤器, 判断得到当前业务节点是否有下级业务-->
<ul>
{% for node in node.id|getNextBusiness %} <!-- 遍历当前业务节点的下级业务节点 -->
{% include "businessNode.html" %} <!-- 再次引入自身页面、判断节点、遍历节点等等, 实现深层迭代得到多级业务节点 -->
{% endfor %}
</ul>
{% endif %}
</li>
现在模板开始通过{% load rbac %}载入自定义标签,此时模板就可以使用过滤器judgefileorfolder,在使用的地方通过node.id|judgefileorfolder,即 变量名|过滤器名 的方式将变量传递给过滤器。再通过django内置模板标签{%if %}{% endif %}即可以完成通过判断过滤器返回值来动态的给<span>标签的class属性赋值。