Django中利用filter与simple_tag为前端自定义函数的实现方法

前言

Django的模板引擎提供了一般性的功能函数,通过前端可以实现多数的代码逻辑功能,这里称之为一般性,是因为它仅支持大多数常见情况下的函数功能,例如if判断,ifequal对比返回值等,但是稍微复杂一些的函数功能并不支持,例如通过模板来判断一个返回值是否是合法的数字类型,此时如果又不希望通过后台视图代码来实现的话,我们就可以自定义一些前端函数功能。

Django为我们提供了两种方式,分别是filter和simple_tag,下面对比两种方式,分别实现判断返回值的功能函数。

准备工作

1、应用程序必须要注册到settings配置文件中

2、在应用目录下创建templatetags目录

3、在templatetags创建模块文件,并导入Django内部方法

filter

在templatetags目录下创建python模块,这里命名为app01_func.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:"100"}}

这里即向后端传递了两个参数,一个是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下面,否则无法生效。

原文地址:https://www.cnblogs.com/MayDayTime/p/9720872.html

时间: 2024-10-07 09:57:13

Django中利用filter与simple_tag为前端自定义函数的实现方法的相关文章

如何在Ubuntu Scope中利用Filter来更加精准地提高搜索的质量

在Ubuntu的Scope,目前正在研发一个新的Filter的功能.我们可以在我们的开发者网站找到有关filter的更多的信息.在那里你可以看到一些关于filter的介绍,但是真正地入手去利用它还是有一定的难度的.今天在我们的例程中,我们来具体展示如何利用filter实现更好的搜索.在实际的应用中,比如我们可以通过filter来实现如下的ctrip的Scope:     在上面的中间的图中,我们可以看到"重庆"被选中了,在第二个列中,我们可以使用我们的department来进行从一个城

Django中利用type动态操作数据库表

场景分析: 后台MySql数据库保存了一大批按股票代码命名的数据表,每张表保存的是每只股票的日线数据. stock_000002 stock_600030 stock_600020 ...一共3000多个表. Django中如果要按股票代码展示每张表的数据,利用常规ORM模型变得非常困难,因为有3000多个表,就需要建3000多个模型. 解决办法: 1. 根据表名.字段等动态创建ORM表模型 def create_model(name, fields=None, app_label='', mo

Django中的日期处理注意事项和自定义时间格式转换

我们在用Django创建models时,常常会涉及时间日期字段的处理,Django里日期相关Field有DateTimeField.DateField和TimeField三种类型,看似简单,但其中有一些容易出错的地方需要注意:另外,如果不习惯Django的默认时间格式,也可以自定义的修改. DateTimeField.DateField和TimeField,其值分别对应着Python里的datetime.datetime.datetime.date和datetime.time三个实例,这三个Fi

django中的filter(), all(), get()

1. 类名.objects中的get(), filter(), all() 的区别 下面定义两个模型类,分别为BookInfo, HeroInfo, BookInfo与HeroInfo为一对多的关系,代码如下: from django.db import models class BookInfoManager(models.Manager): def get_queryset(self): return super(BookInfoManager,self).get_queryset().fi

javaweb中利用filter进行修改字符集

web.xml中如下配置: <filter> <filter-name>SetCharsetEncodingFilter</filter-name> <filter-class>com.buy.util.EncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8<

django中使用filter()(即对QuerySet操作)时踩的坑

代码伺候: 先看如下代码: 例1: message = Message.objects.filter(pk=message_id2) message[0].id = message_id2 message[0].content = content2 message[0].message_type = message_type2 print(message[0].id) print(message[0].content) message[0].save() 可正常从QuerySet中读取数据,并打

fineui中前端自定义函数

在前端可以定义自己想要的函数: <div id="btnreview" class="action btnreview" <%#ShowDisplay(Eval("EnrollmentSituation")) %>></div> (Eval("EnrollmentSituation")这个是函数的参数值,()中的是你需要的控件的ID,就是你想要改变控件,或者你需要的控件 这个是在后台汇总所需

excel中利用综合应用len(),lenb(),left() ,find()函数筛选汉字问题

函数功能及结构介绍: 1.LEN 返回文本串的字符数.Len( text) Len(string | varname) Len 函数的语法有下面这些部分:string 任何有效的字符串表达式.如果 string 包含 Null,会返回 Null. Varname 任何有效的变量名称.如果 varname 包含 Null,会返回 Null.如果 varname 是 Variant,Len 会视其为 String 并且总是返回其包含的字符数. 2.lenb 返回文本串的字节数 3.find函数的语法

SqlServer 中查询子节对应的上级自定义函数

CREATE FUNCTION [dbo].[FN_TopGetOrgByUserName] ( @UserName NVARCHAR(128) ) RETURNS @showOrg TABLE(id NVARCHAR(36)) AS BEGIN DECLARE @baseOrg TABLE(id NVARCHAR(36), fullpath NVARCHAR(200), shortName NVARCHAR(200), parentid NVARCHAR(36), [level] INT,in