本节介绍Django模板层的过滤器和模板继承。
1、模板过滤器
定义:在变量输出时对变量的值进行处理
作用:可以通过使用过滤器来改变变量的输出显示
语法:{{变量 | 过滤器1:’参数值1‘ | 过滤器2:’参数值2‘…}}
官方文档:
https://docs.djangoproject.com/en/2.2/ref/templates/builtins/
常用过滤器:
过滤器 | 说明 |
---|---|
lower | 将字符串转换为全部小写 |
upper | 将字符串转换为大写形式 |
safe | 默认不对变量内的字符串进行HTML转义 |
add: “n” | 将value的值增加n |
truncatechars:‘n’ | 如果字符串多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(”…“)结尾 |
案例
在之前的test_html_param.html进行改造
templates/test_html_param.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>int 是 {{ int | add:'2'}}</h3>
<h3>str 是 {{ str | upper}}</h3>
<h3>list 是 {{ list }}</h3>
<h3>list[0] 是 {{ list.0 }}</h3>
<h3>dict 是 {{ dict }}</h3>
<h3>dict['a'] 是 {{ dict.a }}</h3>
<h3>function 是 {{ func }}</h3>
<h3>class_obj 是 {{ class_obj.say }}</h3>
<h3>script 是 {{ script | safe }}</h3>
</body>
</html>
views.py
def test_html_param(request):
dic = {}
dic['int'] = 88
dic['str'] = 'guoxiaomao'
dic['list'] = ['Tom', 'Jack', 'Lily']
dic['dict'] = {'a': 9, 'b': 8}
dic['func'] = say_hi # 注意传递函数不要加(),加上()相当于把函数的执行结果赋值给func
dic['class_obj'] = Dog()
dic['script'] = '<script>alert(1111)</script>'
return render(request, 'test_html_param.html', dic)
urls.py
path('test_html_param', views.test_html_param),
启动项目,浏览器输入http://127.0.0.1:8000/test_html_param,查看效果
2、模板的继承
模板继承可以使父模板的内容重用,子模板直接继承父模板的全部内容并可以覆盖父模板中相应的块。
语法-- 父模板中:
- 定义父模板中的块block标签
- 标识出哪些在子模块中式允许被修改的
- block标签表示:在父模板中定义,可以在子模板中覆盖
重写的覆盖规则:
不重写,将按照父模板的效果显示
重写,则按照重写效果显示
注意:
模板继承时,服务器端的动态内容无法继承
案例:
定义3个页面,base.html作为主页, music.html, sport.html 继承base.html页面。
base.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
{% block mytitle %}
<title>主页</title>
{% endblock %}
</head>
<body>
{{ lst }} <!--父模板中的传值不会被子模板继承-->
<a href="/music_index">音乐频道</a>
<a href="/sport_index">体育频道</a>
<br>
{% block info %}
这是主页
{% endblock %}
<br>
<h3>有任何问题联系。。。。。</h3>
</body>
</html>
子模板 music.html
{% extends 'base.html' %} <!--继承父模板base.html-->
{% block mytitle %}
<title>音乐频道</title> <!--修改父模板title-->
{% endblock %}
{% block info %}
欢迎来到音乐频道 <!--修改父模板info-->
{% endblock %}
子模板sport.html
{% extends 'base.html' %}
{% block mytitle %}
<title>体育频道</title>
{% endblock %}
{% block info %}
欢迎来到体育频道
{% endblock %}
views.py
def base_view(request):
lst = ['tom','jack'] # 父模板中的传值
return render(request, 'base.html',locals())
def music_view(request):
return render(request, 'music.html')
def sport_view(request):
return render(request, 'sport.html')
urls.py
path('base_index', views.base_view),
path('music_index', views.music_view),
path('sport_index', views.sport_view),
启动项目运行,浏览器输入:http://127.0.0.1:8000/base_index
输入:http://127.0.0.1:8000/music_index
输入:http://127.0.0.1:8000/sport_index
下一篇:Django-URL反向解析