Django之模板语法
目录
模板语法
{{}} 变量相关 {%%} 逻辑相关
模板层之模板传值
python基本数据类型全部支持传递给html文件 函数 类 函数和对象会自动加括号 # 模板语法不支持传参 对象 后端给html文件传递数据的两种方式 1.指名道姓 return render(request,'index.html',{'n':n,'f':f}) 2.locals() # 会将当前名称空间中所有的变量名全部传递给html页面 return render(request,'index.html',locals()) html页面上 如何获取到后端传递过来的数据 {{ 变量名 }}
模板层之模板取值
取值 django模板语法取值 只有一种操作方式 句点符 . 点索引 点键 <p>{{ l.2 }}</p> <p>{{ d.username }}</p> <p>{{ d.password }}</p> <p>{{ d.hobby.1.username.1 }}</p>
模板语法之过滤器
在Django的模板语言中,通过使用 过滤器 来改变变量的显示。 过滤器的语法: {{ value|filter_name:参数 }} 使用管道符"|"来应用过滤器。 例如:{{ name|lower }}会将name变量应用lower过滤器之后再显示它的值。lower在这里的作用是将文本全都变成小写。 注意事项: 1.过滤器支持“链式”操作。即一个过滤器的输出作为另一个过滤器的输入。 2.过滤器可以接受参数,例如:{{ sss|truncatewords:30 }},这将显示sss的前30个词。 3.过滤器参数包含空格的话,必须用引号包裹起来。比如使用逗号和空格去连接一个列表中的元素,如:{{ list|join:', ' }} 4.'|'左右没有空格没有空格没有空格
|length # 返回值的长度,作用于字符串和列表 |add # 加法运算 |default # 如果一个变量是false或者为空,使用给定的默认值。 否则,使用变量的值 |truncatechars # 截取字符串的长度。三个点也算,所有如果要截取5个长度,应该5+3=8的长度 |truncatewords # 截取单词、词语,以空格为标识 |filesizeformat # 把文件大小转换成人能看懂的。KB,GB |slice # 切片操作 |date # 日期格式化 |safe # 取消转义操作
使用案例:
<p>过滤器 |左边的会当做过滤器的第一个参数 过滤器名右边的会当做过滤器的第二个参数</p> <p>求数据长度:{{ s|length }}</p> <p>加法运算:{{ n|add:10 }}、{{ s|add:13132 }}、{{ s|add:'DSB' }}</p> <p>默认值(判断值是否为空):{{ b|default:'这个b布尔值是True' }}、{{ ff|default:'这个ff布尔值是Flase' }}</p> <p>截取字符(截取5个字符 三个点也算):{{ s|truncatechars:8 }}</p> <p>截取单词(截取8个单词 三个点不算):{{ ss|truncatewords:8 }}、{{ sss|truncatewords:4 }}</p> <p>文件大小:{{ file_size|filesizeformat }}</p> <p>切片操作:{{ s|slice:'0:2' }}、{{ s|slice:"0:8:2" }}</p> <p>日期格式化:{{ ddd|date:'Y年/m月/d日' }}</p> <p>转义:{{ res|safe }}、{{ res1 }}、后端直接标识安全:{{ res2 }}</p>
前后端取消转义:
前端 |safe 后端 from django.utils.safestring import mark_safe mark_safe('<h1>安全滴</h1>') 总结:前端代码不一定非要在前端页面写,可以在后端写好传递给前端页面使用 这样的话 你就可以利用到后端更加多的逻辑语法
模板语法之标签
模板语法之标签 (逻辑相关) {% for foo in l %} <!--l = [1,2,3,4,5,6]--> {% if forloop.first %} <p>这是我的第一次</p> {% elif forloop.last %} <p>这是最后一次了啊~</p> {% else %} <p>{{ foo }}</p> {% endif %} {% empty %} <p>for循环的对象内部没有值</p> {% endfor %}
自定义过滤器
自定义过滤器 标签 inclusion_tag 先完成以下前期准备工作 1.在应用名下新建一个名字必须叫templatetags文件夹 2.在该文件夹内新建一个任意名称的py文件(eg:mytag) 3.在该文件内 必须先写以下两句代码 from django.template import Library register = Library() # 自定义过滤器 @register.filter(name='my_sum') def index(a,b): return a + b
第一步定义:
第二步html页面使用方式:
<p>自定义过滤器的使用</p> {% load mytag %} <p>{{ 10|my_sum:90 }}</p>
自定义标签
# 自定义标签 @register.simple_tag(name='my_baby') def xxx(a,b,c,d): return '%s?%s?%s?%s'%(a,b,c,d)
自定义标签的使用:
<p>自定义标签的使用</p> {% load mytag %} <p>{% my_baby 1 2 3 'hello world' %}</p>
总结:
<p>自定义的过滤器可以在逻辑语句中,而自定义的标签不可以</p> {% if 10|my_sum:100 %} <p>条件成立</p> {% endif %} {% if my_baby 1 2 3 4 %} <p>条件成立</p> {% endif %} <p>自定义inclusion_tag的使用</p> {% load mytag %} {% myin 5 %} # 总结 页面上使用他们 统一先导入 {% load mytag %}
模板的继承
某一个页面大部分区域都是公用的 那这个页面就可以作为模板页面 当别人继承这个页面之后 如何修改对应的区域
使用方法:
1.先在模板页面上通过block实现划定区域 {% block content %} 模板页面内容 {% endblock %} 2.子页面中先导入整个模板 {% extends '模板页面.html'%} 修改特定的区域 通过实现划定好的区域名称 {% block content %} 子页面内容 {% endblock %}
通常情况下 模板页面页面应该起码有三块区域
1.css部分 {% block css %} 模板页面内容 {% endblock %} 2.内容部分 {% block content %} 模板页面内容 {% endblock %} 3.JS部分 {% block js %} 模板页面内容 {% endblock %} # 模板的block块越多 可扩展性越高 还支持子页面调用父页面对应区域的内容 并且可以无限次调用 {{ block.super }}
模板的组件
可以将局部样式布局提前写好,然后哪里需要导哪里(不常用)
将html页面当做模块使用 哪里需要导哪里 这个html页面通常都不是完整的 只是一个局部样式 {% include 'left.html' %}
for循环
普通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 %}
或
{% with business.employees.count as total %} {{ total }} employee{{ total|pluralize }} {% endwith %}
模板语法注释
{# 注释内容 #} //这样方式注释,前端浏览器检查看不见 <!--注释内容--> //浏览器检查能看见