Django中通过filter和simple_tag为前端实现自定义函数
Django的模板引擎提供了一般性的功能函数,通过前端可以实现多数的代码逻辑功能,这里称之为一般性,是因为它仅支持大多数常见情况下的函数功能,例如if判断,ifequal对比返回值等,但是稍微复杂一些的函数功能并不支持,例如通过模板来判断一个返回值是否是合法的数字类型,此时如果又不希望通过后台视图代码来实现的话,我们就可以自定义一些前端函数功能。
Django为我们提供了两种方式,分别是filter和simple_tag,下面对比两种方式,分别实现判断返回值的功能函数。
准备工作
1、应用程序必须要注册到settings配置文件中
2、在应用目录下创建templatetags目录
3、在templatetags创建模块文件,并导入Django内部方法
filter
在templatetags目录下创建python模块,这里命名为app01_func.py,内容如下:(templatetags目录与views.py等文件同级)
from django import template
from django.template.defaultfilters import stringfilter register = template.Library() @register.filter
def value_verification(value): # value为前端传递的参数
try:
int(value)
return True
except:
return False
定制完后台功能后,就可以在模板文件中调用函数功能,首选需要在模板文件头中引入后台python模块。
{% load app01_func %}
例如我们需要判断后台返回值load是否为一个有效数字时,可以做如下调用:
{% if load|value_verification %}
{{ load }} is a valid int number.
{% else %}
{{ load }} is letter.
{% endif %}
simple_tag
simple_tag的代码方式与filter一样,不同的是在装饰器部分需要调用simple_tag方法
from django import template
from django.template.defaultfilters import stringfilter register = template.Library() @register.simple # 这里修改为simple_tag
def value_verification(value): # value为前端传递的参数
try:
int(value)
return True
except:
return False
同时前端的调用方式也需要改为
{% value_verification load %}
传递参数
- filter 最多支持两个参数传递
- simple 支持多个参数传递
filter中可以通过下面的方式实现参数传递
{{ load | value_verification:""}}
这里即向后端传递了两个参数,一个是load,另一个是100,后端也要为函数指定好形参:
def value_verification(value, custom): # 配置好形参
...
simple_tag中可以指定多个形参,前台的调用方式如下:
{% value_verification load 100 200 ... %}
这里filter中最多只能接受两个参数,但此时参数又多,又不想使用simple_tag的情况下,可以将多个参数用特定字符拼接成一个字符串传递给后端,后端通过split方式同样能获取多个参数。
对比总结
通过simple_tag和filter可以完成模板引擎无法完成的某些事情,filter将我们指定的函数变成了返回值可执行的方法,simple_tag将函数功能变为标签功能,例如if、ifequal等,同样调用方式也不同,对比如下:
{{ load | value_verification }} # filter
{% value_verification load %} # simple_tag
因为调用方式的不同,如果返回值需要做为if或ifequal判断依据的话,这里使用filter方法最合适,stringfilter方法可以实现将接收到的所有参数变为字符串类型,同register装饰器一样引用到函数方法上即可,这里注意要放在register下面,否则无法生效。但是也可以使用simple_tag ,通过下面的赋值操作,就可以在if ,for等标签中使用了
(这里archives 是simple_tag修饰的方法返回的变量)
{% archives as date_list %}
{% for date in date_list %}
原创文章首发自阿布的博客,本文地址:http://www.abuve.com/article/25
Django中通过filter和simple_tag为前端实现自定义函数的更多相关文章
- Django中利用filter与simple_tag为前端自定义函数的实现方法
转自:http://www.jb51.net/article/116303.htm 前言 Django的模板引擎提供了一般性的功能函数,通过前端可以实现多数的代码逻辑功能,这里称之为一般性,是因为它仅 ...
- django中的filter和get的区别 (MultipleObjectsReturned: get() returned more than one Publisher --)(DoesNotExist: Publisher matching query does not exist.)
上面的例子中`` filter()`` 函数返回一个记录集,这个记录集是一个列表. 相对列表来说,有些时候我们更需要获取单个的对象, `` get()`` 方法就是在此时使用的: >>&g ...
- django中的filter详解
filter (数据过滤) 我们很少会一次性从数据库中取出所有的数据:通常都只针对一部分数据进行操作. 在Django API中,我们可以使用`` filter()`` 方法对数据进行过滤: > ...
- django中的filter(), all(), get()
1. 类名.objects中的get(), filter(), all() 的区别 结论: (1)all()返回的是QuerySet对象,程序并没有真的在数据库中执行SQL语句查询数据,但支持迭代,使 ...
- Django中ORM过滤时objects.filter()无法对月份过滤
django中的filter日期查询属性有:year.month.day.week_day.hour.minute.second 在做复习博客项目时,我把项目从linux移到了windows,然后博客 ...
- django中数据库操作——in操作符
django一对多关系中,为了实现按照一端查询多端,之前都是用extra操作符,经过查看官方文档还有in这个操作符,用这个实现更简单.直接上代码: 根据查询条件模糊查询所有符合条件的机架列表,然后根据 ...
- django 中下载文件与下载保存为excel
一.django 中下载文件 在实际的项目中很多时候需要用到下载功能,如导excel.pdf或者文件下载,当然你可以使用web服务自己搭建可以用于下载的资源服务器,如nginx,这里我们主要介绍dja ...
- python---django中模板渲染(csrf令牌使用,自定义模板函数)
使用终端,可以更方便的去实验,但是没有提示信息: 在项目目录下: D:\MyPython\day23\HelloWorld>python manage.py shell 开始实验: >&g ...
- 152-技巧-Power Query 快速合并文件夹中表格之自定义函数 TableXlsxCsv
152-技巧-Power Query 快速合并文件夹中表格之自定义函数 TableXlsxCsv 附件下载地址:https://jiaopengzi.com/2602.html 一.背景 在我们使用 ...
随机推荐
- dva框架使用mock.js模拟数据 + fetch请求数据
what DVA? Dva是基于Redux做了一层封装,对于React的state管理,有很多方案,我选择了轻量.简单的Dva. dva 可以很方便就使用mock.js进行数据的模拟. 只需要三步,即 ...
- webapp万能选择器:iosselect
iosselect是个什么东西? 移动端浏览器对于select的展示样式是不一致的,ios下是类似原生的picker,安卓下各浏览器展示各异,我们需要一个选择器组件来统一各端下各种浏览器的展示.下面是 ...
- 浏览器存储(cookie、localStorage、sessionStorage)
互联网早期浏览器是没有状态维护,这个就导致一个问题就是服务器不知道浏览器的状态,无法判断是否是同一个浏览器.这样用户登录.购物车功能都无法实现,Lou Montulli在1994年引入到web中最终纳 ...
- Mybatis和JDBC区别
今天面试中问了这个问题,当时答的不好,现在整理一下. JDBC是Java提供的一个操作数据库的API: MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了 ...
- PL/SQL + Oracle客户端 配置记录
oracle一直都没怎么用. oracle pl/sql也是在别人帮助下完成配置. 这次电脑重装后,自己搞定总结了下怎么配置. 1.下载Oracle 客户端. 安装的版本是win64_11gR2_cl ...
- [刷题]Codeforces 785D - Anton and School - 2
Description As you probably know, Anton goes to school. One of the school subjects that Anton studie ...
- LeetCode:1. Add Two Numbers
题目: LeetCode:1. Add Two Numbers 描述: Given an array of integers, return indices of the two numbers su ...
- 无分类编址(CIDR)构成超网
CIDR(无分类域间路由选择) CIDR最主要有两个以下特点: 消除传统的A,B,C地址和划分子网的概念,更有效的分配IPv4的地址空间,CIDR使IP地址又回到无分类的两级编码.记法:IP地址::= ...
- Gephi安装
Gephi for mac https://gephi.org/users/download/ 在官网上下载gephi-0.9.1-macos.dmg双击拖到Application里面就好了,注意有的 ...
- Python lambda 表达式有何用处,如何使用?
在看Python教程的时候,被 lambda 的解释给难住了,之前没有这么用过. 在<简明Python教程>上的解释: [摘录如下:] lambda语句被用来创建新的函数对象,并且在运行时 ...