前言
来看一段代码
def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)
直接把HTML页面嵌套在视图函数里返回给浏览器并不是一个好主意;
原因:
-
对页面设计进行的任何改变都必须对 Python 代码进行相应的修改,牵一发而动全身;
-
Python 代码编写和 HTML 设计是两项不同的工作,前端开发和后端开发无非 并行;
基于这些原因,将HTML页面的设计和后端逻辑设计分离,会更简洁、容易维护开发我们的WEB应用。 我们可以使用 Django的 模板系统 (Template System)来实现这种模式,这就是本章要具体讨论的问题。
模板是什么?
Django自带的模板语言= HTML代码+逻辑控制代码,注意 模板 != HTML,模块 =HTML代码+逻辑控制代码(特殊标记);
模板作用?
在server端 把后端的变量 嵌入到HTML中渲染后,返回给浏览器来达到前后端代码分离,页面动态显示的目的;
一、初探模板
1、模板路径设置
- 首先在项目根目录下创建一个名为 templates 的文件夹,然后根据创建的APP以其名称创建对应的模板文件夹,这里创建了一个 teacher 的APP。
- 在项目目录下的settings.py模块中的 TEMPALTES 列表中的字典中key为DIRS 的value列表中添加上一步的创建的文件夹的路径,添加格式如下:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')], # 在这一行添加 BASE_DIR为项目根目录路径
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
2、渲染
- 方式一
from django.shortcuts import render
from django.http import HttpResponse
from django.template.loader import get_template
def index(request):
tmp = get_template('teacher/index.html')
html = tmp.render()
return HttpResponse(html)
- 方式二
from django.shortcuts import render
def index(request):
return render(request, 'teacher/index.html')
二、模板路径查找
1、查找顺序
- 首先在项目目录下的settings.py模块中的 TEMPALTES 列表中的字典中key为DIRS 的value列表中去依次查找模板路径。
- 其次,当 TEMPALTES 列表的字典中key为 APP_DIRS 的value值为 True 时,会去在settings.py模块下的 INSTALLED_APPS 列表中查找已经注册的APP。然后根据这已经注册的APP在APP目录下的模板文件下查找。
2、两种方案
根据上述模板路径的查找顺序,可以有以下两种方案存放模板路径
- 在一般情况下,模板文件存放在项目根目录下的 templates 文件夹下各APP所对应的的文件夹下,方便统一管理与维护。
- 当一个APP进行复用时,此时需要将此APP的模板文件存放在此APP目录下的模板文件下。、
为什么要在项目根目录下的 templates 文件夹下还要以各APP的名字创建文件夹??
因为当 templates 文件夹下存在与项目APP目录下同名的模板文件的情况下,在查找时会产生冲突。
三、模板变量
1、静态页面与动态页面 优快云解释
2、模板变量
- 语法
- 不能与下划线开头
- 变量的值可以是任何数据类型
3、变量的解析规则
- 计算变量,将其替换为结果
- 遇到点(.)的时候按以下顺序查找:
1. 字典键值查找
2. 属性或方法查找
3. 数字索引查找 - 如果结果是可调用的,则调用它时不带参数,调用的结果成为模板的值(所谓结果是可调用的,说明变量是高函数或者方法)
渲染失败时返回空字符串(’’)
四、模板过滤器(filter)
常用模板过滤器
- add 将参数与值相加 首先尝试转换成整数相加,失败,则尝试所有可能,字符串,列表等。{{ value|add:“2” }}
- capfirst 首字母大写,如果第一个字母不是字母则不起作用。{{ value|capfirst }}
- date 日期格式化 {{ value|date:“D d M Y” }}
- time 时间格式化 {{ value|time:“H:i” }} 格式化格式见官方文档:https://docs.djangoproject.com/en/2.1/ref/templates/builtins/#date
- default 如果变量解析失败,使用给定的默认值。{{ value|default:“nothing” }}(注意如果value是’‘空字符串,输出将会是’nothing’)
- first 返回列表的第一个元素 {{ value|first }}
- last 返回列表的最有一个元素 {{ value|last }}
- slice 返回一个列表的切片 {{ some_list|slice:":2" }}
- join 连接字符串列表 与str.join(list)一样 {{ value|join:" // " }}
- floatformat 浮点数格式化 不指定小数位参数,默认保留一个为小数
value | Template | Output |
---|---|---|
34.23234 | {{ value|floatformat }} | 34.2 |
34.23234 | {{ value|floatformat:3 }} | 34.232 |
- length 返回字符串或列表的长度
- length_is 判断字符串或列表长度是否指定的值,相等返回True {{ value|length_is:“4” }}
- lower 字符串中的字母都变小写{{ value|lower }}
- upper 字符串中的字母都变大写{{ value|upper }}
- safe 关闭变量的自动转义,使html标签生效{{ value|safe }}
- title 标题化,首字母大写 {{ value|title }}
*xss(跨域脚本攻击) 百度百科
五、静态文件的引入
静态文件包括css、js以及图片
- 路径配置——在项目目录下的settings.py模块中配置一下两个变量
1. STATICFILES_DIRS
2. STATIC_URL(默认已经创建,在模块的最后面,默认值为’/static/’)
首先在项目根目录下创建如下图的static目录
然后在settings.py中将 STATICFILES_DIRS 与 STATIC_URL 赋值如下
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')] # 同模板路径设置一样
- 文件引入
1. 硬编码(通过 STATIC_URL )(不推荐)
<link rel="stylesheet" href="/static/teacher/css/index.css">
2. 模板标签
<link rel="stylesheet" href="{% static 'teacher/css/index.css' %}">