django(2):自定义tag和filter,模板继承
我们都知道前端有很多模板语言,其中包括tag和filter,当然了,就像是python自带的很多的基本函数,我们也很少使用,因为开发的过程千变万化,我们想要实现一个功能大部分是需要自定义函数的。基本的filter有add,例如{{num|add:2}},经过渲染到前端显示出来的结果就是num+2的值,但是这个功能太局限了,因此我们也可以自定义tag和filter。
自定义前的准备
首先要在你自己的app目录下面创建一个templatetags文件夹(注:必须是这个名字),然后在settings.py的INSTALLED_APPS列表里面加上自己app的名字,接着在tamplatetags文件夹下面创建py文件,名字可以自定义。在这里我命名为my_tag。

打开my_tag.py,先引入包from django import template
紧接着获取注册表register=template.Library()#register是固定变量名,不能改变
到这里准备工作就做完了。
(注意:调用自定义的tag和filter时候,要先在页面加载之前加载my_tag.py。使用{%load%})
虽然报错了,但是仍然可以运行,这也是我的一个疑问
----------------------自定义tag----------------------
@register.simple_tag
def add100(v1,v2,v3):#tag标签的参数可以是很多个,但是tag不能用于if语句
return v1+v2+v3
前端:{% add100 1 2 3%} 得到的结果:6
----------------自定义filter---------------
@register.filter
def add200(v1,v2):#第一个参数是filter前面的那个,第二个参数是filter冒号后面的那个,最多两个参数
return v1+v2
前端:{{num|add200:20}} 得到的结果为:num+20
filter虽然参数少但是可以应用于if语句里面
{%if num|add200:2 <100%}
<p>小于100</p>
{%else%}
<p>不小于100</p>
{%endif%}
(tag在if里面会报错的)
------------------模板继承---------------------
我们见到过很多界面仅仅是其中的数据变化,而外层的框架没有改变,如果每个界面都重写框架,会做很多复制粘贴的无用功。因此我们可以吧重复的部分当做一个模板,当其他界面使用这个框架时,可以调用并向里面加自定义的内容。
(1)base.html#里面写的是模板内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>购物车</title>
<style>
*{
margin:0;
}
.page-header{
height:100px;
}
.page-body .menu{
float:left;
height:750px;
background-color:antiquewhite;
width:20%;
}
.page-body .content{
height:750px;
background-color:cornflowerblue;
float:right;
width:80%;
}
.page-footer{
height:30px;
background-color:darkcyan;
clear:both;
}
</style>
</head>
<body>
<div>
<div class="page-header"></div>
<div class="page-body">
<div class="menu">
<a href="/blog/ordered">订单</a>
<a href="/blog/shoppingcar">购物车</a>
</div>
<!-- block里面是两个页面不同的地方,其余地方是相同的,因此可以不用书写很多重复的代码-->
<!-- content是自己起的名字,指向不同部分的内容-->
{% block content%}
<div class="content">
yyyyy
</div>
{% endblock %}
</div>
<div class="page-footer"></div>
</div>
</body>
</html>
(2)ordered.html订单页面
<!--相当于继承了based.html里面的内容,也就是继承模板-->
<!--只保留不同的部分-->
{%extends "blog/based.html"%}#先加载公共部份
{%block content%}#这个content要与base.html里面的对应
<div class="content">订单</div>#这个里面写自定义的内容
{%endblock%}
#如果原来based.html的block里面有内容,则会删除重写,如果想要追加,可以使用block.super
<!--{%block content%}-->
<!--{{block.super}}-->
<!--<div class="content">订单</div>-->
<!--{%endblock%}-->
(3)shoppingcar.html购物车页面
<!--相当于继承了based.html里面的内容,也就是继承模板-->
<!--只保留不同的部分-->
{%extends "blog/based.html"%}#先加载公共部份
{%block content%}#这个content要与base.html里面的对应
<div class="content">购物车</div>
{%endblock%}
#如果原来based.html的block里面有内容,则会删除重写,如果想要追加,可以使用block.super
<!--{%block content%}-->
<!--{{block.super}}-->
<!--<div class="content">购物车</div>-->
<!--{%endblock%}-->

浙公网安备 33010602011771号