django——模板层
模板层
目录
- 模板语法传值
- 模板语法传值的范围
- 模板语法过滤器
- 模板语法标签
- 自定义标签函数、过滤器、inclusion_tag
- 模板的继承
- 模板的导入
模板语法传值
-
模板语法传值有两种方法
-
指名道姓的传值
优点:指名道姓的传参,不浪费资源
缺点:当参数多的时候,全传入过于繁琐
def modal(request): name = 'jason' return render(request, 'modal.html', {'name':name})
-
关键字locals()
优点:将整个局部名称空间中的名字去全部传入简单快捷
缺点:当只用较少的数据类型时,浪费资源
def modal(request): name = 'jason' age = 18 gender = 'male' return render(request, 'modal.html', locals())
locals()是将局部名称空间中的所有的名称全部传给modal.html页面
-
-
模板语法传值的范围
-
基本数据类型直接传递使用
-
函数名的传递会自动加括号执行并将返回值展示到页面上
注意函数如果有参数则不会执行也不会展示 模板语法不支持有参函数
-
类名的传递也会自动加括号产生对象并展示到页面上
-
对象的传递则直接使用即可
模板语法会判断每一个名字是否可调用 如果可以则调用!!!
django的模板语法在操作容器类型的时候只允许使用句点符
在用点的时候,django会自动判断的,
如若是字典的键,则直接点键就等得出
若是列表,则用点索引的方式得出,还可以连续的点
-
模板语法过滤器
模板语法过滤器 类似于python中的内置函数
def modal(request):
i = 123
s = 'hello world'
obj = MyClass()
from datetime import datetime
res = datetime.today()
file_size = 214324322432344353234
l = [11, 22, 33]
s1 = 'my name is jason my age is 18 hahaha heiheihei hehehe'
"""有时候html页面上的数据不一定非要在html页面上编写了 也可以后端写好传入"""
from django.utils.safestring import mark_safe
script_tag1 = '<script>alert(666)</script>'
res = mark_safe(script_tag1)
return render(request,'modal.html',locals())
html页面上的数据不一定非要在html页面上编写了 也可以后端写好传入
-
过滤器
模板语法过滤器是将获取的数据,传递到所需要的html文件中,从中使用过滤器获取所需的数据
| 过滤器 | 方法 |
| :------: | :-------------------------------------------------------: |
| 统计长度 | {{ s | length }} |
| 加法运算 | {{ 整型 | add: 数值 }}
{{ 字符型 | add: '字符串' }} |
| 日期转换 | {{ res | date:' Y-m-d H:i:s' }} |
| 文件大小 | {{ file_size | filesizeformat }} |
| 数据切片 | {{ l | slice:'0:10' }} |
| 字符截取 | {{ s1 | truncatechars:6 }} |
| 单词截取 | {{ s1 | truncatewords:6 }} |
| 语法转移 | {{ script_tag1 | safe }} |
语法转移的时候,在后端得到数据转移到html文件需要调用 make_safe来确认此次转移操作,不做确认的话,默认是不能转义的
-
django模板语法中的符号
django模板语法中的符号就两个 一个{{}} 一个{%%}
需要使用数据的时候 {{}}
需要使用方法的时候
模板语法标签
模板语法的标签类似于python中的流程控制
-
if判断
{% if 条件 %} 条件一般是模板语法传过来的数据 直接写名字使用即可 条件成立执行的代码 {% elif 条件1 %} 条件1成立执行的代码 {% else %} 条件都不成立执行的代码 {% endif %} 结束判断指示符
-
for循环
{% for i in s %} {% if forloop.first %} <p>这是第一次哟~</p> {% elif forloop.last %} <p>这是最后一次!</p> {% else %} <p>{{ i }}</p> {% endif %} # 结束判断 {% empty %} # 避免没传入值而报错 <p>你给我的是个空 怎么for循环呢</p> {% endfor %} # 结束for循环
自定义标签函数、过滤器、inclusion_tag
-
自定义标签的前提
1.在应用下创建一个名为templatetags文件夹
2.在该文件夹创建任意名称的py文件
3.在该py文件内编写自定义相关代码
from django.template import Library register = Library()
register为safe内置函数中所定义的装饰器
-
自定义过滤器
过滤器最多只能有两个参数
@register.filter(name='myfilter') def my_add(a, b): return a + b
如何使用:
在django中的任意html界面中引入自定义的过滤器
{% load 过滤器所在的文件命 %} {{ i| myfilter:1 }}
-
自定义标签函数
当过滤器的参数多于两个的情况下,需要设置标签函数
@register.simple_tag(name = 'mt') def func(a,b,c,d): # 此时的参数可以为任意个数 return a=b=c=d
如何使用:
在django中的任意html界面中引入自定义的标签函数
{% mt 标签函数中所使用的参数(不限量) %} { % mt a,b,c,d }
-
自定义inclusion_tag
@register.inclusion_tag(filename='it.html') def index(n): html = [] for i in range(n): html.append('第%s页'%i) return locals() # 把html这个列表传给 filename='it.html'
在it.html页面
<ul> {% for i in html %} <li>{{ i }}</li> {% endfor %} </ul> 渲染标签
最后再在所需要调用的html界面设置
{% index 10 %}
模板的继承
如若模板界面类似,可直接利用django的特性,直接继承主界面的所有网页界面
-
使用的方法:
将创建的文件所有东西删除掉之后,使用{% extends 'html文件名' %}方法 可直接继承以写好的网页代码
-
继承之后需要做出修改
1. 在母板界面(被继承的页面) 在所需要做出的修改的地方做出操作 {{% block 名字 %} 模板内容 {% endblock %}} 2.在子板界面(继承的界面) {% block 名字 %} 子板内容 {% endblock %}
由此方法可以在继承的基础之上,在另一页面对所引的界面 内容做出大致更改
其他地方不会做出改变
一般情况下母板中至少应该有三个区域(css 、content 、js)使得扩展性更高!!!
-
继承之后可以利用母板的三个区域做出自身子板的样式更改
1.css样式更改 {% block css %} css样式 {% endblock %} 2.content 样式更改 {% block content %} content 样式 {% endblock %} 3.js样式更改 {% block js %} js样式 {% endblock %}
子板中还可以使用母板的内容 {{ block.super }}
模板的导入
将html页面的某个部分当做模块的形式导入使用
设置好一个模块的样式,然后在html文档中使用
{% include 'html文件名' %}
可直接在此html文件中的某一模块置换成所导入的模块的样式