Django基础之模板
Django模板系统
常用语法
只需要记两种特殊符号:
{{ }} 和 {% %}
变量相关的用{{ }},逻辑相关的用{% %}。
变量
{{ 变量名 }}
变量名由字母数字和下划线组成。
点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值。
几个例子:
view中代码:

- def template_test(request):
- l = [11, 22, 33]
- d = {"name": "alex"}
- class Person(object):
- def __init__(self, name, age):
- self.name = name
- self.age = age
- def dream(self):
- return "{} is dream...".format(self.name)
- Alex = Person(name="Alex", age=34)
- Egon = Person(name="Egon", age=9000)
- Eva_J = Person(name="Eva_J", age=18)
- person_list = [Alex, Egon, Eva_J]
- return render(request, "template_test.html", {"l": l, "d": d, "person_list": person_list})

模板中支持的写法:

- {# 取l中的第一个参数 #}
- {{ l.0 }}
- {# 取字典中key的值 #}
- {{ d.name }}
- {# 取对象的name属性 #}
- {{ person_list.0.name }}
- {# .操作只能调用不带参数的方法 #}
- {{ person_list.0.dream }}

Filters
语法: {{ value|filter_name:参数 }}
default
{{ value|default:"XXX"}} 取不到值时默认显示的
- {{ value|default: "nothing"}}
如果value值没传的话就显示nothing
length
{{ value|length }} 返回value的长度,如 value=['a', 'b', 'c', 'd']的话,就显示4.
备注:"|" 的左右两侧没有空格。
filesizeformat
将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB'
, '4.1 MB'
, '102 bytes'
, 等等)。例如:
- {{ value|filesizeformat }}
如果 value 是 123456789,输出将会是 117.7 MB。
slice
切片,(数字不能切片)
- {{value|slice:"2:-1"}}
date
格式化
- {{ value|date:"Y-m-d H:i:s"}}
safe
Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。
比如:
value = "<a href='#'>点我</a>"
- {{ value|safe}}
truncatechars
如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。
参数:截断的字符数
- {{ value|truncatechars:9}}
自定义filter
自定义过滤器只是带有一个或两个参数的Python函数:
- 变量(输入)的值 - -不一定是一个字符串
- 参数的值 - 这可以有一个默认值,或完全省略
例如,在过滤器{{var | foo:“bar”}}中,过滤器foo将传递变量var和参数“bar”。
自定义filter代码文件摆放位置:

- app01/
- __init__.py
- models.py
- templatetags/ # 在app01下面新建一个package package
- __init__.py
- app01_filters.py # 建一个存放自定义filter的文件
- views.py

编写自定义filter

- from django import template
- register = template.Library()
- @register.filter(name="cut")
- def cut(value, arg):
- return value.replace(arg, "")
- @register.filter(name="addSB")
- def add_sb(value):
- return "{} SB".format(value)

使用自定义filter

- {# 先导入我们自定义filter那个文件 #}
- {% load app01_filters %}
- {# 使用我们自定义的filter #}
- {{ somevariable|cut:"0" }}
- {{ d.name|addSB }}

Tags
for
- <ul>
- {% for user in user_list %}
- <li>{{ user.name }}</li>
- {% endfor %}
- </ul>
for循环可用的一些参数:
Variable | Description |
---|---|
forloop.counter |
当前循环的索引值(从1开始) |
forloop.counter0 |
当前循环的索引值(从0开始) |
forloop.revcounter |
当前循环的倒序索引值(从1开始) |
forloop.revcounter0 |
当前循环的倒序索引值(从0开始) |
forloop.first |
当前循环是不是第一次循环(布尔值) |
forloop.last |
当前循环是不是最后一次循环(布尔值) |
forloop.parentloop |
本层循环的外层循环 |
for ... empty
主要用于一些友好的提示信息,比如:一个某某列表中没有数据或者搜索不到数据时,可以在结果为空时友好的做一个提示:没有数据。

- <ul>
- {% for user in user_list %}
- <li>{{ user.name }}</li>
- {% empty %}
- <li>空空如也</li>
- {% endfor %}
- </ul>

if,elif和
else

- {% if user_list %}
- 用户人数:{{ user_list|length }}
- {% elif black_list %}
- 黑名单数:{{ black_list|length }}
- {% else %}
- 没有用户
- {% endif %}

当然也可以只有if和else
- {% if user_list|length > 5 %}
- 七座豪华SUV
- {% else %}
- 黄包车
- {% endif %}
if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。
with
定义一个中间变量
- {% with total=business.employees.count %}
- {{ total }} employee{{ total|pluralize }}
- {% endwith %}
csrf_token
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
这个标签用于跨站请求伪造保护。
用法:在页面的form表单里面写上{% csrf_token %}
Django中内置了一个专门处理csrf问题的中间件
django.middleware.csrf.CsrfViewMiddleware
这个中间件做的事情:
1. 在render返回页面的时候,在页面中塞了一个隐藏的input标签
用法:
我们在页面上 form表单 里面 写上 {% csrf_token %}
<input type="hidden" name="csrfmiddlewaretoken" value="8gthvLKulM7pqulNl2q3u46v1oEbKG7BSwg6qsHBv4zf0zj0UcbQmpbAdijqyhfE">
2. 当你提交POST数据的时候,它帮你做校验,如果校验不通过就拒绝这次请求
注释
- {# ... #}
注意事项
1. Django的模板语言不支持连续判断,即不支持以下写法:
- {% if a > b > c %}
- ...
- {% endif %}
2. Django的模板语言中属性的优先级大于方法
- def xx(request):
- d = {"a": 1, "b": 2, "c": 3, "items": "100"}
- return render(request, "xx.html", {"data": d})
如上,我们在使用render方法渲染一个页面的时候,传的字典d有一个key是items并且还有默认的 d.items() 方法,此时在模板语言中:
- {{ data.items }}
默认会取d的items key的值。
母板

- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="x-ua-compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Title</title>
- {% block page-css %}
- {% endblock %}
- </head>
- <body>
- <h1>这是母板的标题</h1>
- {% block page-main %}
- {% endblock %}
- <h1>母板底部内容</h1>
- {% block page-js %}
- {% endblock %}
- </body>
- </html>

注意:我们通常会在母板中定义页面专用的CSS块和JS块,方便子页面替换。
继承母板
在子页面中在页面最上方使用下面的语法来继承母板。
- {% extends 'layouts.html' %}
块(block)
通过在母板中使用{% block xxx %}
来定义"块"。
在子页面中通过定义母板中的block名来对应替换母板中相应的内容。
- {% block page-main %}
- <p>世情薄</p>
- <p>人情恶</p>
- <p>雨送黄昏花易落</p>
- {% endblock %}
组件
可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方按如下语法导入即可。
- {% include 'navbar.html' %}
静态文件相关
- {% load static %}
- <img src="{% static "images/hi.jpg" %}" alt="Hi!" />
引用JS文件时使用:
- {% load static %}
- <script src="{% static "mytest.js" %}"></script>
某个文件多处被用到可以存为一个变量
- {% load static %}
- {% static "images/hi.jpg" as myphoto %}
- <img src="{{ myphoto }}"></img>
使用get_static_prefix
- {% load static %}
- <img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />
或者
- {% load static %}
- {% get_static_prefix as STATIC_PREFIX %}
- <img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" />
- <img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!" />
自定义simpletag
和自定义filter类似,只不过接收更灵活的参数。
定义注册simple tag
- @register.simple_tag(name="plus")
- def plus(a, b, c):
- return "{} + {} + {}".format(a, b, c)
使用自定义simple tag
- {% load app01_demo %}
- {# simple tag #}
- {% plus "1" "2" "abc" %}
inclusion_tag
多用于返回html代码片段
示例:
templatetags/my_inclusion.py

- from django import template
- register = template.Library()
- @register.inclusion_tag('result.html')
- def show_results(n):
- n = 1 if n < 1 else int(n)
- data = ["第{}项".format(i) for i in range(1, n+1)]
- return {"data": data}

templates/snippets/result.html
- <ul>
- {% for choice in data %}
- <li>{{ choice }}</li>
- {% endfor %}
- </ul>
templates/index.html

- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="x-ua-compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>inclusion_tag test</title>
- </head>
- <body>
- {% load inclusion_tag_test %}
- {% show_results 10 %}
- </body>
- </html>

Django基础之模板的更多相关文章
- Django基础篇--模板和路由分发
Django模板 首先什么是一个模板? 简单来说就是一个网页,可以被view响应给用户 目的是为了解决复杂的显示问题 2. 模板的设置问题 setting.py中的TEMPLATES配置 1)BACK ...
- django基础 -- 4. 模板语言 过滤器 模板继承 FBV 和CBV 装饰器 组件
一.语法 两种特殊符号(语法): {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 二.变量 1. 可直接用 {{ 变量名 }} (可调用字符串, 数字 ,列表,字典,对象等) ...
- Django基础(2)--模板自定义标签和过滤器,模板继承 (extend),Django的模型层-ORM简介
没整理完 昨日回顾: 视图函数: request对象 request.path 请求路径 request.GET GET请求数据 QueryDict {} request.POST POST请求数据 ...
- Django基础之模板层
内容概要 模板层(模板语法) 模板语法传值模板语法过滤器(内置方法)模板语法标签(流程控制)自定义过滤器和标签(了解) 模板的导入与继承(面向对象) 内容详细 1 模板层之模板语法传值 http ...
- Python之路-(js正则表达式、前端页面的模板套用、Django基础)
js正则表达式 前端页面的模板套用 Django基础 js正则表达式: 1.定义正则表达式 /.../ 用于定义正则表达式 /.../g 表示全局匹配 /.../i 表示不区分大小写 /.../m ...
- django基础2: 路由配置系统,URLconf的正则字符串参数,命名空间模式,View(视图),Request对象,Response对象,JsonResponse对象,Template模板系统
Django基础二 request request这个参数1. 封装了所有跟请求相关的数据,是一个对象 2. 目前我们学过1. request.method GET,POST ...2. reques ...
- Django基础之视图(views)层、模板层
目录 Django基础之视图(views)层.模板层 JsonResponse 向前端返回一个json格式字符串的两种方式 重写Django中的json的某个方法 form表单上传文件 FBV与CBV ...
- day 68 Django基础四之模板系统
Django基础四之模板系统 本节目录 一 语法 二 变量 三 过滤器 四 标签Tags 五 模板继承 六 组件 七 自定义标签和过滤器 八 静态文件相关 一 语法 模板渲染的官方文档 关 ...
- day 54 Django基础四之模板系统
Django基础四之模板系统 本节目录 一 语法 二 变量 三 过滤器 四 标签Tags 五 模板继承 六 组件 七 自定义标签和过滤器 八 静态文件相关 一 语法 模板渲染的官方文档 关于模 ...
随机推荐
- Uva 1590 IP Networks
这道题目是一道关于IP地址的题目,要深入理解这道题需要有一定的网络基础. 这道题目我第一次做的时候虽然也AC了,但代码写的比较复杂,不够精炼.近期刚刚参加了网络方面的培训,在有一定知识的基础上,又重写 ...
- 团队作业4——第一次项目冲刺(Alpha版本)-第一篇
第一次项目冲刺——第一阶段 今天我们在宿舍开了个会,每个人都斗志昂扬的.撸起袖子加油干! 分工讨论 团队成员 任务 郭达 完成博客随笔和leangoo 刘德培 设计好数据库 石浩洋 搭建好LAM ...
- vue2.0实现页面刷新时某个input获得focus
通过自定义指令:
- Java-Eclipse-Jabref一条龙
Java部分: 1. 到Oracle官网下载需要版本的JDK:http://www.oracle.com/technetwork/java/javase/archive-139210.html 2. ...
- LeetCode--Remove Linked List Element
Remove all elements from a linked list of integers that have value val. ExampleGiven: 1 --> 2 --& ...
- 2018牛客多校第一场 B.Symmetric Matrix
题意: 构造一个n*n的矩阵,使得Ai,i = 0,Ai,j = Aj,i,Ai,1+Ai,2+...+Ai,n = 2.求种类数. 题解: 把构造的矩阵当成邻接矩阵考虑. 那么所有点的度数都为2,且 ...
- C++的一些小操作、常用库及函数(持续更新)
1. 强制保留n位小数(位数不足则强制补零) 头文件: #include <iomanip> 在输出前: cout<<setprecision(n); 也有不用头文件的方式,在 ...
- WIndows 相关知识
Windows服务 图解WinXP局域网共享设置步骤 Win10如何搭建FTP服务器以实现快速传输文件 强大工具psexec工具用法简介 BIOS和CMOS的区别 系统CLSID简介和小技巧
- MySQL 服务器安装及命令使用
本文来自实验楼相关部分的文档和实验操作过程. 一.MySQL简介 MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,提高了速度并提高了灵活性.My ...
- CentOS系统缺少库文件解决办法
By francis_hao May 31,2017 程序在编译时出现缺少库文件的提示,如下: as: error while loading shared libraries: libz. ...