首页 > 技术文章 > Django自定义simple_tag和filter

forsaken627 2020-03-19 13:04 原文

摘要

1.模板:

模板是一个纯文本文件,或是一个用Django模板语言标记过的普通的Python字符串。 模板可以包含模板标签和变量。
而Django的模板引擎提供了一些类似于函数的功能,通过前端可以实现代码逻辑的功能,例如大小写转换、加减乘除等

2.模板标签:

是在一个模板里面起作用的的标记,可以产生控制结构的语句,也可以展现内容,或者获取其他的模板标签

内部提供的一些方法,官方参考链接

大家可以查看python3.6/site-packages/django/template/defaultfilters.py 中定义的方法,里面有很多,不对其一个个的列举,只提几个常用的:

  • {{ value|lower }} 字符串转换成小写
  • {{ value|length }} 测量长度
  • {{ value|make_list }} 将字符串转换为列表,内部其实调用的就是list(value)
  • {{ value|upper }} 转化成大写
  • {{ value_list|first }} 获取列表的第一个元素,当然还有last
  • {{ value_lsit|join:'-' }} 像python一样,将一个列表转化为字符串,第二个参数是拼接的字符串
  • {{ value|length_is:'10' }} 判断一个对象的长度是否是多少,返回布尔值
  • {{ value|random }} 在给定的字符串、列表(不能是一个字典)中随机取出一个来返回
  • {{ value_lsit|slice:"0:3" }} 列表的切片,跟Python的语法相同
  • {{ value|add:"value" }} 字符串拼接,类似于Python中的+,需要保持数据类型的统一
  • {{ value|date:"" }} 日期格式化
  • {% now "jS F Y H:i" %} 与上相同,类似的还有time
  • {{ value|truncatewords:"30" }} 截取字符串的前30个字符
  • ...

自定义simple_tag

自己设定自己的一些小功能

  • settings必须注册app
  • 在app中新增templatetags目录,V3中不需要__init__.py
  • 在改目录下创建py文件此处举例为tag_add.py,内容为一个个的函数方法

目录结构:

your_app01/
    __init__.py
    views.py
    admin.py
    models.py
    templatetags/
            __init__.py
            tag_add.py
    

逻辑:

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

register = template.Library()

# 写了两个简单的方法,作用都是返回两个值得和,也可以作为字符的拼接,此处使用装饰器来注册
@register.simple_tag  # 注册自定义simple_tag
def bibibi(a1, a2):
    return a1 + a2

@register.filter  # 注册自定义过滤器filter
def lalala(a1, a2):
    return a1 + a2
  • 在html中使用,必须在html最头部加上
{% load tag_add.py %}
# 注意,改html中如果有继承其他模板,就必须放在{% extends 'layout.html' %}的后面

{#filter具体使用#}
{{ args1|lalala:'args2'

{#simple_tag具体使用,参数按照位置参数的方式传递#}
{{ bibibi args1  args1 }}

simple_tag和filter的区别

  • simple_tag在参数接收的时候可以按照位置参数的方式传递很多个参数
  • filter理论上只可以传递两个参数,但是万不得已我们可以把多个参数封装成一个参数中传递

推荐阅读