转自:http://www.jb51.net/article/116303.htm

前言

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

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

准备工作

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

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

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

filter

在templatetags目录下创建python模块,这里命名为app01_func.py,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
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模块。

1
{% load app01_func %}

例如我们需要判断后台返回值load是否为一个有效数字时,可以做如下调用:

1
2
3
4
5
{% if load|value_verification %}
 {{ load }} is a valid int number.
{% else %}
 {{ load }} is letter.
{% endif %}

simple_tag

simple_tag的代码方式与filter一样,不同的是在装饰器部分需要调用simple_tag方法

1
2
3
4
5
6
7
8
9
10
11
12
13
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

同时前端的调用方式也需要改为

1
{% value_verification load %}

传递参数

- filter 最多支持两个参数传递

- simple 支持多个参数传递

filter中可以通过下面的方式实现参数传递

1
{{ load | value_verification:"100"}}

这里即向后端传递了两个参数,一个是load,另一个是100,后端也要为函数指定好形参:

1
2
def value_verification(value, custom): # 配置好形参
 ...

simple_tag中可以指定多个形参,前台的调用方式如下:

1
{% value_verification load 100 200 ... %}

这里filter中最多只能接受两个参数,但此时参数又多,又不想使用simple_tag的情况下,可以将多个参数用特定字符拼接成一个字符串传递给后端,后端通过split方式同样能获取多个参数。

对比总结

通过simple_tag和filter可以完成模板引擎无法完成的某些事情,filter将我们指定的函数变成了返回值可执行的方法,simple_tag将函数功能变为标签功能,例如if、ifequal等,同样调用方式也不同,对比如下:

1
2
{{ load | value_verification }} # filter
{% value_verification load %} # simple_tag

因为调用方式的不同,如果返回值需要做为if或ifequal判断依据的话,这里只能使用filter方法了,stringfilter方法可以实现将接收到的所有参数变为字符串类型,同register装饰器一样引用到函数方法上即可,这里注意要放在register下面,否则无法生效。

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

  1. Django中通过filter和simple_tag为前端实现自定义函数

    Django的模板引擎提供了一般性的功能函数,通过前端可以实现多数的代码逻辑功能,这里称之为一般性,是因为它仅支持大多数常见情况下的函数功能,例如if判断,ifequal对比返回值等,但是稍微复杂一些 ...

  2. js中使用function定义类、实例化,函数的调用方法

    function Test002(name, age){ name, age, this.printInfo = function(){ //定义的公有方法 console.log(name, age ...

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

    场景分析: 后台MySql数据库保存了一大批按股票代码命名的数据表,每张表保存的是每只股票的日线数据. stock_000002 stock_600030 stock_600020 ...一共3000 ...

  4. Django前端获取后端数据之前端自定义函数

    在写网站的时候遇到了一个问题: Django在后端向前端传数据时,多数会使用dict字典来传送多个数据,但前端只能遍历,没有一个用key取到value值的方法可以直接使用 如果作为一个list传递到前 ...

  5. django中两张表有外键关系的相互查找方法,自定义json编码方法

    两张通过外键联系的表,如何在一张表上根据另一张表上的属性查找满足条件的对象集? 平常查找表中数据的条件是python中已有的数据类型,通过名字可以直接查找.如果条件是表中外键列所对应表的某一列,该如何 ...

  6. PHP中call user func()和call_user_func_array()调用自定义函数小结

    call_user_func() 和 call_user_func_array(),通过传入字符串函数,可以调用自定义函数,并且支持引用,都允许用户调用自定义函数并传入一定的参数: 1.mixed c ...

  7. django中的filter和get的区别 (MultipleObjectsReturned: get() returned more than one Publisher --)(DoesNotExist: Publisher matching query does not exist.)

    上面的例子中`` filter()`` 函数返回一个记录集,这个记录集是一个列表. 相对列表来说,有些时候我们更需要获取单个的对象, `` get()`` 方法就是在此时使用的: >>&g ...

  8. django中的filter详解

    filter (数据过滤) 我们很少会一次性从数据库中取出所有的数据:通常都只针对一部分数据进行操作. 在Django API中,我们可以使用`` filter()`` 方法对数据进行过滤: > ...

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

    1. 类名.objects中的get(), filter(), all() 的区别 结论: (1)all()返回的是QuerySet对象,程序并没有真的在数据库中执行SQL语句查询数据,但支持迭代,使 ...

随机推荐

  1. 绑定方式开始服务&调用服务的方法

    1.编写activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/androi ...

  2. HttpClient(一)-- HelloWorld

    一.简介 HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的 ...

  3. urllib 简介

    (1) urllib 是 Python 内置的 HTTP 请求库,用来向服务器发送 HTTP 请求(2) 在 Python2.x 中,有 urllib 和 urllib2 两个模块:在 Python3 ...

  4. api 25 PopupWindow会占据整个屏幕

    解决方法:if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // Android 7.x中,PopupWindow高度为match_pa ...

  5. MQTT_DEMO

    1 /* 2 Copyright (c) 2009-2012 Roger Light <roger@atchoo.org> 3 All rights reserved. 4 5 Redis ...

  6. 在input中既隐藏边框,也隐藏轮廓的设置

    在设置input的时候,我们往往不想显示边框,所以通常会在css里面写"border"none",但是结果往往差强人意,如下图 我们这个时候可以加一个属性来把它的轮廓也隐 ...

  7. codeforces水题100道 第十一题 Codeforces Round #143 (Div. 2) A. Team (brute force)

    题目链接:http://www.codeforces.com/problemset/problem/231/A题意:问n道题目当中有多少道题目是至少两个人会的.C++代码: #include < ...

  8. System.Web.Mvc.AJAX缺少程序集引用

    今天在构建新项目的时候,出现这个错误,实际上这个出现过很多次了,但是每次都忘记之前怎么解决的,之前博客也不记得写过没有...

  9. UVALive - 3507 Keep the Customer Satisfied

    题意:收到n个订单,每个订单有q,d分别代表做这个的时间,和最晚的完成时间,问你最多能接受几个订单 思路:贪心,我们显然要按最早的完成时间排序,那么接下来,我们用(6,8)和(4,9)做为例子,按照我 ...

  10. [转]C++中模板的特化与偏特化

    转载自:http://hi.baidu.com/klcdyx2008/blog/item/5adbf77b79f316f90bd1873c.html 1.引言C++中的模板分为类模板和函数模板,虽然它 ...