Django框架之模板层
模板语法符号:
{{ }} 变量相关的
{% %} 逻辑相关的
模板语法的注释:{# 注释的模板语法 #},浏览器是检查看不见的
1、模板语法之模板传值
python基本数据类型、函数、类、对象全部都支持传递给HTML文件
后端传递给HTML文件数据的两种方式
1、指名道姓的传
return render(request, 'index.html', {'res':dic})
2、locals() 会将当前名称空间中的所有变量名全部传递给HTML页面
return render(request, 'index.html', locals())
前端html页面如何获取传递过来的值:{{ 变量名 }}
前端html文件中通过模板语法取值,只有一种方式:句点符,不能通过.get()方式获取
可以通过点索引,点值,也可以通过连用句点符
<p>{{ l.2 }}</p> <p>{{ d.username }}</p> <p>{{ d.password }}</p> <p>{{ d.hobby.1.username.1 }}</p> <p>{{ func }}</p> <p>{{ obj.get_static }}</p> <p>{{ MyClass.get_static }}</p>
注意:当使用模板语法时,展示的是函数的返回值,并且引用函数名会加括号自动执行,模板语法,不支持有参函数的模板语法,传类名时也会自动加括号实例化
2、模板语法之过滤器
过滤器是用 | 表示,左边是过滤器的第一个参数,右边的会当做过滤器的第二个参数
1、求数据的长度 | length
<p>数据长度:{{ s|length }}</p>
2、加法运算 | add
{#只能数字之间或者字符串之间相加,不能混合使用#} <p>加法:{{ s|add:'dsb' }}</p>
3、默认值 | default
{#默认值判断是否为空,不是空返回True,是空是返回冒号右边的#} <p>b默认值:{{ b|default:'假时返回false' }}</p> <p>bo默认值:{{ bo|default:'假时返回False' }}</p>
4、截取字符 | truncatechar:n
{#截取5个字符还有3个是点#} <p>截取字符:{{ s|truncatechars:8 }}</p>
5、按照空格截取单词 | truncateword:n
{#按照空格截取截取4个单词,后面会有三个点不算进#} <p>截取单词:{{ s|truncatewords:4 }}</p>
6、文件大小 | filesizeformat
<p>文件大小:{{ file_size|filesizeformat }}</p>
7、切片操作 | slice:'0:2'
{#可以按照步长来切片#} <p>切片操作:{{ st|slice:'0:4' }}、{{ st|slice:'0:6:2' }}</p>
8、日期格式化 | date:'Y年/m月/d日'
{#可以支持日期格式操作#} <p>日期格式化:{{ dd|date }}、{{ dd|date:'Y年/m月/d日' }}</p>
9、转义 |safe
可以后端直接标识安全,在后端中处理,所以前端的代码可以在后端中写好传递给前端,可以做更多的逻辑语法
# 后端中标识安全 from django.utils.safestring import mark_safe re_safe = mark_safe('<h1>怎么这么好看</h1>')
<p>转义前端标识安全:{{ re|safe }}、后端已经标识安全了:{{ re_safe }}</p>
3、模板语法之标签(逻辑相关)
{% for foo in l %}
{{ forloop }}
{% endfor %}
forloop拿到的是:
可以用forloop方法中的first和last判断是否是可迭代对象第一个和最后一个
{% for foo in l %} {% if forloop.first %} <p>第一个参数</p> {% elif forloop.last %} <p>最后一个参数</p> {% else %} <p>{{ foo }}</p> {% endif %} {% endfor %}
for循环如果循环对象内部没有值,可以用empty来判断
{% for foo in l %} {% if forloop.first %} <p>第一个参数</p> {% elif forloop.last %} <p>最后一个参数</p> {% else %} <p>{{ foo }}</p> {% endif %} {% empty %} <p>for循环的对象中没有值</p> {% endfor %}
for循环中也可以循环字典的所有键、所有值、所有的键值对
{% for foo in dic.keys %} <p>{{ foo }}</p> {% endfor %} {% for foo in dic.values %} <p>{{ foo }}</p> {% endfor %} {% for foo in dic.items %} <p>{{ foo }}</p> {% endfor %}
当一个值获取的步骤非常繁琐的时候,我们可以起别名的方式来简化代码,别名只能在with中使用
{% with dic.hobby.1.small_hobby.1 as hob %} <p>{{ hob }}</p> {% endwith %}
4、自定义过滤器、标签、inclusion_tag
前期准备工作:
1、在应用名下新建一个必须名为 templatetags 文件夹
2、在该文件夹内新建任意一个py文件
3、在该py文件内必须写以下两句代码
from django.template import Library register = Library()
1、自定义过滤器
在templatetags文件内的py文件中自定义过滤器用 @register.filter(name='名字') 将名字传给前端,作为过滤器
注意:自定义过滤器中最多只能传两个参数
from django.template import Library register = Library() # 自定义过滤器 @register.filter(name='my_sum') def index(a,b): return a + b
自定义过滤器的使用,在html文件中先要调用 load py文件 ,再使用过滤器
<p>自定义过滤器的使用</p> {% load mytag %} <p>{{ 10|my_sum:90 }}</p> <p>自定义的过滤器可以在逻辑语句中而自定义的标签不可以</p> {% if 10|my_sum:20 %} <p>条件成立</p> {% endif %}
2、自定义标签
在templatetags文件内的py文件中自定义过滤器用 @register.simple_tag(name='名字') 将名字传给前端,作为标签,自定义标签可以有多个参数
# 自定义标签 @register.simple_tag(name='my_bq') def aaa(a, b, c, d): return f"{a, b, c, d}" # 返回多个值默认存入元组返回
自定义标签使用,需要先调用 load py文件 ,注意自定义的标签不能进行逻辑语句
{% load my_tag %}
{% my_bq 1 2 'abc' 'hello' %}
3、自定义inclusion_tag
自定义inclusion_tag将进行逻辑判断等一系列操作后的数据传递给第三方html文件渲染到页面上
使用 @register.inclusion_tag('html文件',name='名字'),将名字传递给前端进行传参给函数后引用第三方html文件将其渲染到页面上
# 自定义inclusion_tag @register.inclusion_tag('login.html', name='my_in') def xxx(n): l=[] for i in range(n): l.append(i) return locals()
<p>自定义inclusion_tag的使用</p> {% load mytag %} {% myin 5 %}
5、模板的继承
某一个页面上有很多部分是公用的,那这个页面就可以作为模板页面,别人继承这个页面后,可以修改对应的区域
1、先在模板页面上通过block划分区域,通常在模板页面应该划分最少三个区域,模板的block快越多,可扩展性就越高
{% block css %}
模板页面内容CSS
{% endblock %}
{% block content %}
模板页面内容
{% endblock %}
{% block js %}
模板页面内容js代码
{% endblock %}
2、在子页面上先清空整个HTML文件再导入整个模板,再继承该模板进行修改特定区域
1、导入整个模板
{% extends '模板页面.html'%}
2、修改特定的区域 通过实现划定好的区域名称
{% block content %}
子页面内容
{% endblock %}
3、子页面还可以支持调用父页面对应的区域,并且无限次调用,在content中调用就引用父页面的content中的内容,在哪个里面调用就会引用父页面中的对应的内容
{{block.super}}
4、模板的导入
可以将html页面当做模块使用,哪里需要导哪里,通常这个HTML文件中只是局部的一个样式用
{% include '自定义的HTML文件' %} {# 导入模板文件#} {% extends 'mb.html' %} {% block css %} <style> h1 { color: #4cae4c; background-color: #8a6d3b; } </style> {% endblock %} {% block content %} {# 引用自己的HTML文件#} {% include 'my_html.html' %} <h1 class="text-center">注册</h1> <form action="" method="post"> <p>username: <input type="text" name="username" class="form-control"></p> <p>password: <input type="password" name="password" class="form-control"></p> <input type="submit" class="btn btn-success"> </form> {# 继承父页面的区域内容#} {{ block.super }} {{ block.super }} {{ block.super }} {{ block.super }} {% endblock %}