Django 学习笔记之自定义标签、过滤器的使用(实现动态为html标签class属性赋值)

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

自定义过滤器:

  1.   自定义过滤器就是写一个函数
  2.  使用过滤器器时把值传入该函数
  3.  函数完成后,需要进行注册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属性赋值。

发布了24 篇原创文章 · 获赞 30 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/yufen9987/article/details/90270833