目录
一、模板变量分配
定义
在后端变量的值通过模板语法传到前端
符号{{}}:主要与数据值相关{%%}:主要与逻辑相关
模板语法注意点:1.针对需要加括号调用的名字 django模板语法会自动加括号调用你只需要写名字就行2.模板语法的注释{##},前端浏览器是无法查看的,因为它要先在后端运行3.django的模板语法是自己写的 跟jinja2不一样,只能用句点符的方式点出来
模板语法两种传值方法
return render(request, "demo02.html", {"n1": name, "a1": age}) # 传值方式1:精准传值 不浪费资源 针对多资源的传递书写麻烦
return render(request,"demo02.html", locals()) # 传值方式2:将函数名称空间中所有的名字全部传递 名字过多并且不使用的情况下比较浪费资源
- 模板语法传值特性1.基本数据类型正常展示2.文件对象也可以展示并调用方法3.函数名会自动加括号执行并将返回值展示到页面上(不支持额外传参)4.类名也会自动加括号调用,对象则不用加括号也可以调用(除非用魔法)
ps:总结针对可以加括号调用的名字模板语法都会自动加括号调用
- 代码展示
前端
{{ f }}
{{ i }}
{{ s }}
{{ l }}
{{ d }}
{{ t }}
{{ se }}
{{ b }}
{{ f_obj }}
{{ f_obj.read }}
你看到了什么 快分享给我看看!!! {{ func1 }}
{{ MyClass }}
{{ obj }}
{{ obj.get_obj }}
{{ obj.get_cls }}
{{ obj.get_static }}
后端
def func(request): # python基本数据类型 f = 1.11 i = 666 s = "hello jason! say hello big baby ha ha ha" l = [11, 22, 33, 44] d = {"name": "jason", "age": 18} t = (11, 22, 33, 44) se = {11, 22, 33, 44} b = True # 文件对象 f_obj = open(r"D:\pythonProject03\djangoday04\今日内容.md", "rb") # 函数 def func1(): print("上午犯困 下午也犯困 晚上还犯浑") return "熬夜会上瘾" # 类 class MyClass(object): def get_obj(self): return "绑定给对象的方法" @classmethod def get_cls(cls): return "绑定给类的方法" @staticmethod def get_static(): return "静态方法" obj = MyClass()
页面效果
二、模板的过滤器
定义
模块语法自带的一些内置函数
语法
{{obj|filter__name:param}} 变量名字|过滤器名称:变量
default
如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如:
{{ value|default:"nothing"}}
- length返回值的长度。它对字符串和列表都起作用。例如:如果 value 是 [‘a’, ‘b’, ‘c’, ‘d’],那么输出是 4。
{{ value|length }}
- filesizeformat将值格式化为一个 “人类可读的” 文件尺寸 (例如 "13 KB", "4.1 MB", "102 bytes", 等等)。例如:如果 value 是 123456789,输出将会是 117.7 MB
{{ value|filesizeformat }}
- date如果 value=datetime.datetime.now()
{{ value|date:"Y-m-d"}}
- slice如果 value=”hello world”,将会是llo worl
{{ value|slice:"2:-1"}}
- truncatechars如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“…”)结尾。参数:要截断的字符数
{{ value|truncatechars:9}}
- safeDjango的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。比如:
value="点击"{{ value|safe}}from django.utils.safestring import mark_saferes = mark_safe("HELLO WORLD
")
- 代码展示
前端
{{ i|add:10 }}
{{ s|add:"baby" }}
{{ l|length }}
{{ s|slice:"1:4" }}
{{ value|slice:"2:-1"}}
{{ s|truncatechars:5 }}
{{ s|truncatewords:3 }}
{{ ctime|date:"Y年-m月-d日 H时:i分:s秒 " }}
{{ file_size|filesizeformat }}
{{ h1|safe }}
{{ s1|safe }}
后端
def func(request): from datetime import date,datetime ctime = datetime.today() import os file_size = 424232423423432 h1 = "哈哈哈哈
" s1 = "<script>confirm(123)</script>" return render(request, "funcPage.html", locals())
页面效果
三、模板之标签
- if标签在html页面if ,然后tab键补全语法
{% if 条件1(可以自己写也可以用传递过来的数据) %}今天又是周三了
{% elif 条件2(可以自己写也可以用传递过来的数据) %}百日冲刺
{% else %}没多少时间了!
{% endif %}
- for标签在html页面for ,然后tab键补全语法
{% for k in t1 %}{% if forloop.first %}这是我的第一次循环{{ k }}
{% elif forloop.last %}这是我的最后一次循环{{ k }}
{% else %}这是中间循环{{ k }}
{% endif %}{% empty %}你给我传的数据是空的无法循环取值(空字符串、空列表、空字典)
{% endfor %}
- forloop关键字
# 遍历字典# 字典的三剑客keys values itemsforloop.counter The current iteration of the loop (1-indexed) 当前循环的索引值(从1开始)forloop.counter0 The current iteration of the loop (0-indexed) 当前循环的索引值(从0开始)forloop.revcounter The number of iterations from the end of the loop (1-indexed) 当前循环的倒序索引值(从1开始)forloop.revcounter0 The number of iterations from the end of the loop (0-indexed) 当前循环的倒序索引值(从0开始)forloop.first True if this is the first time through the loop 当前循环是不是第一次循环(布尔值)forloop.last True if this is the last time through the loop 当前循环是不是最后一次循环(布尔值)forloop.parentloop 本层循环的外层循环
ps: django模板语法取值操作>>>:只支持句点符,句点符既可以点索引也可以点键
d1 = {"name": "jason", "age": 18, "hobby": ["read", "music", {"a1": "haha", "a2": "heihei"}]}{{ d1.hobby.2.a1 }}
- 起别名复杂数据获取之后需要反复使用可以起别名
{% with d1.hobby.2.a1 as h %} {{ h }}{% endwith %}
四、自定义过滤器、标签及inclusion_tag(了解)
- 前期准备工作如果想要自定义一些模板语法 需要先完成下列的三步走战略1.在应用下创建一个名字必须叫templatetags的目录2.在上述目录下创建任意名称的py文件3.在上述py文件内先编写两行固定的代码
from django import templateregister = template.Library()
- 自定义过滤器(最大只能接收两个参数)
@register.filter(name="myadd")def func1(a, b): return a + b
目前编辑的页面代码
{% load mytags %} # 加载自己创建的py文件{{ i|myadd:1 }}
- 自定义标签(参数没有限制)
@register.simple_tag(name="mytag")def func2(a, b, c, d, e): return f"{a}-{b}-{c}-{d}-{e}"
目前编辑的页面代码
{% load mytags %} # 加载自己创建的py文件{% mytag "jason" "kevin" "oscar" "tony" "lili" %}
- 自定义inclusion_tag(局部的html代码)
调用函数,在一个自己新建的空html文件中执行,执行完后再塞进需要用的html页面
@register.inclusion_tag("menu.html",name="mymenu")def func3(n): html = [] for i in range(n): html.append("第%s页 "%i) return locals()
新建的借助menu.html页面代码
{% for liStr in html %} {{ liStr|safe }} {% endfor %}
目前编辑的页面代码
{% load mytags %} # 加载自己创建的py文件{% mymenu 20 %}
五、模板的继承和导入
模板的继承(重要)
定义
多个页面有很多相似的地方 我们可以采取下列方式
- 方式1:传统的复制粘贴
- 方式2:模板的继承
1.在模板中使用block划定子板以后可以修改的区域 {% block 区域名称 %}继承的旧代码区域 {% endblock %} 2.子板继承模板 {% extends "home.html" %} # 首先要先导入母版 {% block 区域名称 %} 继承的新代码区域 {% endblock %}补充:子板也可以继续使用模板的内容 {{ block.super }}
ps:模板中至少应该有三个区域,分别是页面内容区、css样式区、js代码区
模板的导入(了解)
定义
将某个html的部分提前在一个空的html页面写好 之后很多html页面都想使用就可以导入,在需要导入的地方
{% include "myform.html" %}
直接上代码,以后可以粘贴复制
- 母板
Title {# <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.js"></script>#} {# #} {# <script src="bootstrap-3.4.1-dist/js/bootstrap.js"></script>#} {% load static %} <script src="{% static "jquery.min.js" %}"></script> <script src="{% static "bootstrap-3.4.1-dist/js/bootstrap.min.js" %}"></script> - Dapibus ac facilisis in
- Cras sit amet nibh libero
- Porta ac consectetur ac
- Vestibulum at eros
{% block content %} {% endblock %}
- 子板1
{% extends "Monpage.html" %}{% block css %} {% endblock %}{% block content %} 登录页面
{% include "daoru.html" %} {% endblock %}{% block js %} <script>alert("注册页面")</script>{% endblock %}
- 子板2
{% extends "Monpage.html" %}{% block css %} {% endblock %}{% block content %} 注册页面
{% include "daoru.html" %} {% endblock %}{% block js %} <script>alert("注册页面")</script>{% endblock %}
- 母板页面效果
- 子板页面效果
关键词: