django 05 模板层
模板层语法传值
# 1.模板语法传值有两种方式 {{}}: 主要与数据值有关的传值 {%%}: 主要与逻辑相关的传值 """django的模板语法是自己写的,与jinja2不同""" -1.针对于需要加括号调用的名字,django模板语法填写无需加括号,只写名字就会直接调用 -2.模板语法的注释无法在前端查看到 注释语法: {##} # 2.模板语法传值 传值方式1:精准传值不浪费资源,但是对于传递值多的比较麻烦 return render(request, 'html页面',{'name': name, 'age' = age}) 传值方式2:将函数名称空间中所有的名字全部传递出去,但是名字过多,用到较少时比较浪费资源 return render(request, 'html页面',locals())
模板层语法传值特性
# 1.基本数据类型正常展示 八大基本数据类型 # 2.文件对象也可以展示并调用方法 视图层views: file_obj = open(r'文件路径', 'rb') 前端模板语法: <p>{{ file_obj }}</p> # 展示文件信息 <p>{{ file_obj.read }}</p> # 读取文件内容 # 3.函数名会自动加括号执行并将返回值展示到页面上(不可以额外传参) 视图层views: def func(): print('一二三四五六七') return '谁写代码谁sb' 前端模板语法: <p>{{ func1 }}</p> # 4.类名也是自动加括号调用,对象不会自动加括号调用 视图层views: class MyClass(object): def get_obj(self): return '绑定给对象的方法' @classmethod def get_cls(cls): return '绑定给类的方法' @staticmethod def get_static(): return '静态方法' obj = MyClass() 前端模板语法: <p>{{ MyClass }}</p> <p>{{ obj }}</p> <p>{{ obj.get_obj }}</p> <p>{{ obj.get_cls }}</p> <p>{{ obj.get_static }}</p> ps:针对可以加括号的名字模板语法都会自动加括号调用
模板语法之过滤器
<p>{{ i|add:10 }}</p> # 两个都是整型就是就是数字加起来 <p>{{ s|add:'baby' }}</p> # 两个都是字符串就是拼接 <p>{{ l|length }}</p> # 显示出l的字符长度 <p>{{ s|slice:'1:4' }}</p> # 对s的字符进行切片1~4 <p>{{ s|truncatechars:5 }}</p> # 按照字符展示相应位数 ...计算在内 <p>{{ s|truncatewords:3 }}</p> # 按照空格展示相应的单词数 <p>{{ ctime|date:'Y年-m月-d日 H时:i分:s秒 ' }}</p> # 展示格式化时间,注意分钟的代表 <p>{{ file_size|filesizeformat }}</p> # 换算对象的大小(kb,mb...) <p>{{ h1|safe }}</p> # safe会开启前端的识别,识别后h1 = '<h1>哈哈哈哈</h1>'就会变为标题 哈哈哈哈 <p>{{ s1|safe }}</p>
模板层之标签
# 1.模板语法标签 -1. if相关: {% if 条件1(可以自己写也可以用传递过来的数据) %} 条件1成立执行的代码 {% elif 条件2(可以自己写也可以用传递过来的数据) %} 条件2成立执行的代码 {% else %} 条件都不成立执行的代码 {% endif %} -2. for相关: {% for i in s %} {% if forloop.first %} <p>第一次for循环</p> {% elif forloop.last %} <p>最后一次for循环</p> {% else %} <p>中间的循环{{ i }}</p> {% endif %} {% empty %} <p>传过来的数据是空的,不能for循环</p> {% endfor %}
# django模板语法取值只支持句点符,句点符既可以点索引也可以点键。 例: {{ s1.hobby.1.music}} # 复杂数据的获取可以起别名 {% with s1.hobby.1.music as a1 %} <a href="">{{ a1 }}</a> {% endwith %}
自定义过滤器
# 1.如果想要自定义标签函数,需要先准备一些事情 -1.在应用下创建一个文件夹名字为templatetags -2.在temolatetags文件夹创建任意名字的py文件 -3.在py文件中内部编写自定义相关代码 -4.在py文件内导入固定代码 form django.template import library register = Library() & from django import template register = template.Library() # 2.自定义过滤器(最大只能接收两个参数) @register.filter(name='myadd') def func1(a, b): return a+b {% load mytags %} <p>{{ i|myadd:1 }}</p> # 3.自定义标签(参数没有限制) @register.simple_tag(name='mt') def func2(a, b, c, d): return a + b + c + d {% load mytags %} {% mt 'jason' 'kevin' 'oscar' 'tony' 'lili' %} # 4.自定义inclusion_tag(局部的html代码) @register.inclusion_tag(filename='it.html') def index(n): html = [] for i in range(n): html.append('第%s页'%i) return locals() # 在HTML页面上调用一个inclusion_tag,其会作用于一个html页面(局部),将其插入原来调用的位置 {% load mytags %} {% index 10 %}
模板的继承于导入
# 1.模板的继承 """多个页面有许多相似的地方,所以需要用到继承(只适合前后端混合的项目)""" 空的HTML文件: {% extends 'html文件名' %} # 全部继承 -1.模板中使用block划定子板后可以修改的区域 改一个页面需要在原模版上提前做好标记 {% block 名字 %} # 标记未来继承时要修改的 模板内容 {% endblock %} -2.子模版继承 继承的页面,先继承全部 {% block 名字 %} # 要修改的子模版代码(修改后) 子模版内容 {% endblock %} -3.一般模板上有三个区域可以使拓展性更高 css样式: {% block css %} {% endblock %} html标签内容 {% block content %} {% endblock %} js代码 {% block js %} {% endblock %} -4.子板中还可以使用母板的内容 {{ block.super }} # 2.模板的导入 -1.把html页面某个部分当作模块的形式导入使用 {% include 'menu.html' %}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律