第六章深入模板
6.1Django模板引擎
Django内置的模板引擎包含模板上下文(模板变量),标签,过滤器
模板上下文(模板变量):变量值有视图函数或视图类传递所得
标签:对变量进行控制输出,例如判断和循环控制等
过滤器:多变量进行操作处理。
6.1.1模板上下文(变量)
{{ variable }}
#variable1='字符串或整型'
#variable2={'name':'字典或实例化对象'}
#variable3=['元组或列表']
<div>{{ variable1 }}</div>
<div>{{ variable2.name }}</div>#属性
<div>{{ variable3.0 }}</div>#索引
6.1.2自定义标签
{% tag%}
Django内置模板标签:
{% if %}:判断标签,对上下文进行条件判断
{% for %}:循环标签,遍历输出上下文的内容
{% url %}:路由标签,引用路由配置的地址,生成相应的路由地址
{% csrf_token%}防跨站请求伪造攻击
{% with %}:将上下文重写命名
{% load %}:加载导入django标签库
{% static %}:读取静态资源的文件内容
{% extends xxx%}:继承xxx模板
{% block xxx %}:重写父类模板的代码
#for 标签
{% for item in mylist %}
{{ item }}
{ % endfor % }
#if 标签
{% if name=='lucy' %}
{{ name }}
{% elif name=='lily' %}
{{ name }}
{% else %}
{{ name }}
{% endif %}
#url 标签
#生成不带变量的URL地址
<a href="{% url 'index' %}">首页</a>
#生成带变量的URL地址
<a href="{% url 'page' 1 %}">第一页</a>
#with 标签
{% with total=number %}
{{ total }}
{% endwith %}
#load 标签
#导入静态文件标签库staticfiles
{% load staticfiles %}
#static 标签
#来自静态文件标签库staticfiles
{% static 'css/index.css' %}
forloop对象的使用
{% for name in name_list %}
{% if forloop.counter==1 %}
<span>这是第一次循环</span>
{% elifforloop.last %}
<span>这是最后一次循环</span>
{% else %}
<span>本次循环次数为:{{ forloop.counter }}</span>
{% endif %}
{% endfor %}
自定义模板标签:
(1)在项目根目录下创建新的文件夹(mydefined)
(2)在该文件夹下创建初始化文件__init__.py和templatetags文件夹。必须以templatetags命名
(3)在templatetags文件夹下创建初始化文件__init__.py和自定义标签文件mytag.py
(4)在配置文件setting.py属性INSTALLED_APPS里添加自定义模板标签的文件夹
INSTALLED_APPS = [
......
'django.contrib.staticfiles',
'index',
'mydefined',
]
(5)在项目mytag.py文件里自定义标签(reversal)
(6)在模板文件中使用自定义标签
#导入自定义标签文件mytags
{% load mytags %}
<!DOCTYPE html>
<html>
<body>
{% reversal 'Django' %}
</body>
</html>
#页面显示ognajD
6.1.3模板继承
通过模板标签实现,将多个模板文件的共同代码集中在一个新的模板文件中,在各个模板中调用该模板
使用:
(1)在tempaltes 文件夹创建base.html文件,作为公用模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
{% block title %}
<title>首页</title>
{% endblock %}
</head>
<body>
{% block body %}
{% endblock %}
</body>
</html>
(2)在其他模板中调用
#声明调用公用模板
{% extends 'base.html' %}
{% block body %}
<a href="{% url 'index:index' %}">首页</a>
<h1>hello django</h1>
{% endblock %}
6.1.4自定义过滤器
{{ variable | filter |lower}}
过滤器支持多个过滤器同时使用
过滤器支持传入参数,过滤器与参数用冒号隔开但不能有空格
{{ variable | date:'D d M y' }}
自定义过滤器:
(1)在项目根目录下创建新的文件夹(mydefined)
(2)在该文件夹下创建初始化文件__init__.py和templatetags文件夹。必须以templatetags命名
(3)在templatetags文件夹下创建初始化文件__init__.py和自定义过滤器文件myfilter.py
(4)在配置文件setting.py属性INSTALLED_APPS里添加自定义模板标签的文件夹
INSTALLED_APPS = [
......
'django.contrib.staticfiles',
'index',
'mydefined',
]
(5)在项目myfilter.py文件里自定义过滤器(replace)
(6)在模板文件中使用自定义过滤器
#导入自定义过滤器文件myfilter
{% load myfilter %}
<!DOCTYPE html>
<html>
<body>
<div>替换前:{{ value }}</div>
<br>
<div>替换后:{{ value | replace:'python:Django' }}</div>
</body>
</html>
页面显示将python替换为Django
6.2 Jinja2模板引擎
6.2.1安装与配置2
安装
pip install Jinja2
校验(python交互式命令行)
import jinja2
jinja2.version
配置:
(1)在项目文件夹新建jinja2.py文件。(与settings.py在同级目录下)
(2)在jinja2文件中定义函数environment,并在函数里使用jinja2的类Environment进行实例化,实例化对象env用于对接django的运行环境
#jinja2.py
from django.contrib.staticfiles.storage import staticfiles_storage
from django.urls import reverse
from jinja2 import Environment
def environment(**options):
env=Environment(**options)
env.globals.update({
'static':staticfiles_storage.url,
'url':reverse,
})
return env
(3)将jinja2.py文件定义的函数environment写到配置文件settings.py中。
以下配置模板文件夹templates的所有模板文件都是有jianja2模板引擎执行解析处理
Django内置的功能使用django模板引擎
TEMPLATES = [
#使用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',
],
},
},
#使用jinja2模板引擎
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [
os.path.join(BASE_DIR,'templates')
],
'APP_DIRS': True,
'OPTIONS': {
'environment':'DjangoTemplateView.jinja2.environment',
},
},
]
6.2.2模板语法
jinja2与django的区别在于static函数,url函数,过滤器的使用
#static标签
#Django的用法
{% static 'cat.ico' %}
#jinja2的用法:
{{ static('cat.ico') }}
#上下文使用
#django的用法
{{ value.name }}
#jinja2的用法
{{ value['name'] }}
#使用过滤器
<div>{{ value['name'] | replace('Jinja2','Django') }}</div>
{#for循环#}
{#Django的用法:{% for k,v in value.items %}#}
{% for k,v in value.items() %}
<div>key is {{ k }}</div>
<div>value is {{ v }}</div>
{% endfor %}
{#if判断#}
{% if value %}
<div>This is if</div>
{% else %}
<div>This is else</div>
{% endif %}
{#url标签#}
{#Django的用法:{% url 'index:index' %}#}
<a href="{{ url('index:index') }}">首页</a>
6.2.3自定义过滤器
在jinja2.py文件里定义函数myReplace,并将函数注册到jinja2的环境函数environment里。完成过滤器的自定义
#jinja2.py
from django.contrib.staticfiles.storage import staticfiles_storage
from django.urls import reverse
from jinja2 import Environment
def myReplace(value, old='Jinja2', new='Django'):
return str(value).replace(old, new)
# 将jinja2模版设置到项目环境
def environment(**options):
env = Environment(**options)
env.globals.update({
'static': staticfiles_storage.url,
'url': reverse,
})
env.filters['myReplace'] = myReplace
return env
参考书籍《Django web应用开发实战》