三、Django模板
模板Templates
在Django框架中,模板是可以帮助开发者快速生成呈现给用户页面的工具
模板的设计方式实现了我们MVT中VT的
解耦(M:Model,V:View,T:Template)
,VT有着N:M的关系,一个V可以调用任意T,一个T可以供任意V使用模板处理分为两个过程
- 加载HTML
- 渲染数据 render()
模板主要有两个部分
HTML静态代码
模板语言,动态插入的代码段(挖坑,填坑) {{ name }}
模板中的动态代码段除了做基本的静态填充,还可以实现一些基本的运算,转换和逻辑
静态页面: 页面数据是本地固定的
动态页面: 页面数据来源于后台服务器
模板中的变量:视图传递给模板的数据,遵守标识符规则
语法:{{ var }}
如果变量不存在,则插入空字符串
方法不能有参数
{{ str }}
{{ str.upper }} # 不能带括号
{{ str.isdigit }}
{{ dict.key }}
列表,使用索引,不允许使用负索引
items = ['apple' 'bananas']
{``{ items.1 }}
MVC软件设计模式
: Model(数据库),View(界面),Controller(控制器,相当于Django的视图函数)MVT : M:Model(数据库),V:View视图函数,T:Template(界面)
模板中的标签
语法: {``{% tag %}}
作用:
- 加载外部传入的变量
- 在输出中创建文本
控制循环或逻辑
django
if 语句:
格式:
if单分支
{% if表达式 %} 语句 {% endif %}
if双分支
{% if表达式 %} 语句 {% else %} 语句2 {% endif %}
if多分支
{% if表达式 %} 语句 {% elif表达式 %} 语句2 {% else %} 语句3 {% endif %}
判断true或者false(可以使用and or not in,语法与python类似)
{% if tody_is_weekend %}
\<p>Welcome to the weekend!!!\</p>
{% endif %}
使用 in 和 not in
{% if user in users %}
\<p>User已经存在</p>
{% endif %}
django
for 语句
{% for 变量 in 列表 %}
语句1
{% empty %}
语句2
{% endfor %}
当列表为空或者不存在的时候,执行empty后的语句
===================forloop.counter示例=================
{% forloop.counter %} 表示当前是第几次循环,从1开始
{% for item in todo_list %}
<p> {{forloop.counter}} : {{ item }} </p>
{% endfor %}
{{ forloop.counter0 }}表示当前是第几次循环,从0开始
{{ forloop.revcounter }}表示当前是第几次循环,倒着数数,到1停
{{ for1oop.revcounter }}表示当前第几次循环,倒着数,到0停
{{ forloop.first }}是否是第一个 布尔值
{% for object in objects %}
{% if forloop.first %}
<li class="first">{{ object }}</li>
{% else %}
<li>{{ object }}</li>
{% endif %}
{% endfor %}
{% for link in links %}
{{ link }}{% if not forloop.last %}|{% endif %}
{% endfor %}
===================forloop.parentloop示例=================
{% for country in countries %}
<table>
{% for city in country.city_list %}
<tr>
<td>Country #{{ forloop.parentloop.counter }}</td>
<td>City #{{ forloop.counter }}</td>
<td>{{ city }}</td>
</tr>
{% endfor %}
</table>
{% endfor %}
django
注释:
单行注释
{# 被注释掉的内容 #}
多行注释
{% comment %} 多行内容 {% endcomment %}
django
过滤器:
{{ var|过滤器 }}
作用: 在变量显示前修改
add:
{{ value|add:2 }}
没有减法过滤器,但加法里可以加负数:
{{ value|add:-2 }}
lower:
{{ name|lower }}
upper:
{{ my_list|fisrt|upper }} 将my_list的第一个值变成大写
截断:
{{ bio|truncatechars:30 }}
过滤器可以传递参数,参数需要使用引号引起来,
比如join:{{ students|join:'=' }}
默认值: default,格式{{ var|default:value }}
如果变量没有被提供或者为False,空,会使用默认值
根据指定格式转换日期为字符串,处理时间的
就是针对date进行的转换{{ dateVal | date:'y-m-d'}}
django
HTML转义:
将接收到的数据当成普通字符串处理还是当成HTML代码来渲染的一个问题
渲染成html:
{{ code|safe }}
关闭自动转义
{% autoescape off %}
code
{% endautoescape %}
打开自动转义转义
{% autoescape on %}
code
{% endautoescape %}
django
模板继承:
block:
{% block XXX %}
code
{% endblock %}
extends 继承,写在开头位置
{% extends'父模板路径'%}
include:加载模板进行渲染
{% include'模板文件'%}
{{ block.super }}:获取父模板中block中的内容
在Django模板中使用jinja2模板引擎
Jinja2
是之前我们在Flask框架
讲过的一个模板引擎,是模仿Django默认模板引擎基础上开发的,比Django模板引擎性能更好,功能更全.
jinja2宣称比django默认模板引擎快10-20倍。Django也支持jinja2
1.安装jinja2模块
python
pip install jinja2
2.在settings.py所在的目录中创建jinja2_env.py文件,并写入以下内容
python
from django.templatetags.static import static
from django.urls import reverse
from jinja2 import Environment
def environment(**options):
env = Environment(**options)
env.globals.update({
'static': static,
'url': reverse,
})
return env
3.修改项目的settings.py文件
原本的不能删除
python
TEMPLATES = [
# 使用jinja2模板引擎
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
# 这里要添加environment变量,指向自定义的jinja2环境,DjangoPro2项目目录下的jinja2_env.py文件里面的environment函数
"environment": "DjangoPro2.jinja2_env.environment",
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
# 原来自带的Django模板引擎
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'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',
],
},
},
]
4.在修改Pycharm中settings的模板语言为Jinja2
创建html文件,使用Jinja2语法
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Jinja2模板语言</title>
</head>
<body>
<h2>Jinja2模板语言</h2>
<hr>
<p>name = {{ name }}</p>
{% for n in name %}
<b>{{n}}</b>
{% endfor %}
<hr>
{% for n in name %}
<div>{{loop.index}} : {{n}}</div>
{% endfor %}
{# Jinja2是可以使用带括号的函数调用的 #}
{% for i in range(1, 10) %}
<div>{{i}}</div>
{% endfor %}
</body>
</html>
注意: 这只是一个简单的Jinja2模板语法示例,要使用更多语法,可以查阅以下资料