Django 3种自定义模板标签

Django有许多内置的模板标签(template tags)比如{% if %} ,{% for cate in cate_list %}.... 如果这些模板标签不能满足您的需要,你也可以自己定义模板标签.

Django提供了以下帮助函数(functions)来允许你以一种简单的方式创建自己的模板标签(template tags):

  • filter: 过滤器   
  • simple_tag:处理数据并返回一个字符串(string) , 从前端取数据,然后在后端处理成变量,替换前端. 例子:计算器
  • inclusion_tag:处理数据并返回一个渲染过的模板(template),后端处理数据渲染前端页面

 

模板中自定义函数

 

  • 已注册的app中创建一个名字叫 templatetags 的包,这个文件夹的名字必须叫它. 这个app,一定在setting.py 中的installapps中已经注册,也就是存在
  • 在其下任意创建一个py文件, 比如叫text1.py文件的命名是非常重要的。你将在模板(template)中使用这些模块的名字加载你的标签(tags)。
  • 创实例化一个名字叫register 的Library类的对象
  • 定义函数
  • 在使用自定义simple_tag和filter的html文件中导入之前在templatetags中创建的py文

 

1、register.filter 过滤器   

HTML中的参数传入到函数中当做该函数的参数,然后该函数返回数据给前端渲染页面.

第一个例子:

test1.py中

from  django.template import Library
register = Library()
@register.filter
def f(a):
    print(a)
    return '你好'

html页面:设置为:

{% load text1 %}#先导入这个文件
{{ '小红'|f }}

结果:

后端打印结果为:

小红

前端页面渲染为:

你好

 第二个例子: 

在前端页面中f2可以先传入个参数,最后会一起传到后端来.,注意后端的f2()中也要有两个参数

from  django.template import Library
register = Library()
@register.filter
def f(a1,a2): #这种方法这里只能传两个参数,但是可以放在if判断中
    data = '我的名字是{},我喜欢{}'.format(a1,a2)
    return data

HTML:

{% load text1 %} #先导入这个文件
{{ '小红'|f:'小明' }} 第二个参数是函数后边紧跟着冒号然后跟参数
 

页面渲染结果:

我的名字是小红,我喜欢小明

第三个例子:register.filter 用在if 判断 中

 text1.py

from  django.template import Library
register = Library()
@register.filter
def f(a):
    if 'es' in a:
        return '你好'
    else:
        return False

html

{% load text1 %}
{% if 'yesyoucan'|f %}
    <p>'回答正确'</p>
{% else %}
    <p>'回答错误'</p>
{% endif %}

页面渲染结果:

'回答正确'

 

2、register.simple_tag 

创建text2.py

 这个可以传多个参数装饰器和上面的不一样了, 但是这种方法不能放在if判断中

from django.template import Library #这个是传多个参数装饰器和上面的不一样了, 但是这种方法不能放在if判断中
register = Library()
@register.simple_tag
def f(a,b,c,d):
    return a+b+c+d

 HTML

{% load text2 %} #先导入这个文件
{% f 1 2 3 4 %} #这里的调用方式和

前端页面渲染:

10

 

3、register.inclusion_tag

inclusion_tag。它多用于一个HTML片段的。

例如:博客首页左侧栏和博客详情、列表页左栅栏的一样的。为了不用重复写同样的代码。且提高页面的扩展性,也可以使用此方法。

或者:在页面中生成一个表:

这里主要以生成表为例:

首先在templatetags创建text3.py:

from django.template import Library
register = Library()

@register.inclusion_tag("zidingyi/list.html")
def list(a):
    list = []
    for i in range(1, a + 1):
        dict = {}
        dict['key'] = i
        dict['text'] = '%s的平方是%s' % (i, i * i)
        list.append(dict)
    return {'list':list}


然后在tempaltes创建list.html写一个列表代码块。

<table>
    <tr>
        <th>key</th>
        <th>texy</th>
    </tr>
    {% for i in list %}
    <tr>
        <td>{{ i.key }}</td>
        <td>{{i.text}}</td>
    </tr>
    {% endfor %}
</table>


最后在test.html页面中加载自定义模块

{% load text3 %}
{% list 3 %} #3是一个参数。

前端渲染结果:

目录结构:


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值