动态地生成HTML网页,DJinjajango可以配置一个或多个模板引擎,有Django模板语言(Django Template Language,DTL)和Jinja2。
1.Django模板引擎
包括:模板上下文、标签、过滤器
- 模板上下文:以变量的形式写入模板文件,变量由视图函数或视图类传递所得。
- 标签:对模板上下文进行控制输出,比如模板上下文的判断和循环控制等。
- 模板继承属于标签,将每个模板文件重复的代码抽取出来并写在一个共用的模板文件中,其他模板文件通过继承共用模板文件来实现完整的网页输出。
- 过滤器:对模板上下文进行处理,比如模板上下文的内容截取、替换或格式转换。
1.1 模板上下文
模板上下文是模板中基本的组成单元,上下文的数据由视图函数或者视图类传递。以{{variable}}表示,variable是上下文的名称,支持数据类型。
1.2 自定义标签
标签是对模板上下文进行控制输出,以{%tag%}表示,tag是标签的名称,Django有许多内置标签{%if%}、{%for%}、{%url%}
自定义模板标签:
1. 在项目根目录下创建新的文件夹自命名eg:mydefined,并在文件夹下创建初始化文件__init__.py 和templatetags文件夹(命名固定不变),在templatetags文件夹中创建初始化文件__init__.py 和自定义标签文件mytags.py。
2. 在配置文件settings.py的属性INSTALLED_APPS里添加 mydefined。
3. 在mytags.py中写标签。eg:定义一个数据处理反转标签。
from django import template
# 创建模版对象
register = template.Library()
# 定义模版节点类
class ReversalNode(template.Node):
def __init__(self, value):
self.value = str(value)
# 数据反转处理
def render(self, context):
return self.value[::-1]
# 声明并定义标签
@register.tag(name='reversal')
# parse是解析器对象,token是被解析的对象
def do_reversal(parse, token):
try:
# tag_name是代表标签名,即reversal
# value是由标签传递的数据
tag_name, value = token.split_contents()
except:
raise template.TemplateSyntaxError('syntax')
# 调用自定义的模板节点类
return ReversalNode(value)
4. 使用时需要在模板文件中导入自定义标签文件{%load mytags%}
{#导入自定义标签文件mytags#}
{% load mytags %}
<!DOCTYPE html>
<html>
<body>
{% reversal 'Django' %}
</body>
</html>
1.3 模板继承
模板继承是通过模板标签来实现的,其作用是将多个模板文件的共同代码集中在一个新的模板文件中。{%extends “base.html”%}
1.4 自定义过滤器
通过过滤器处理上下文可以将其数据格式或内容转化为我们想要的效果显示,而且相应减少视图的代码量。{{variable|filter}},eg:
{{value|add:“2”}},将value的值增加2。
自定义过滤器:
1.在mydefined的templatetags里创建myfilter.py文件
from django import template
# 创建模版对象
register = template.Library()
# 声明并定义过滤器
@register.filter(name='replace')
def do_replace(value, agrs):
oldValue = agrs.split(':')[0]
newValue = agrs.split(':')[1]
return value.replace(oldValue, newValue)
2.使用时需要在模板文件中导入自定义标签文件{%load myfilter%}
{#导入自定义过滤器文件myfilter#}
{% load myfilter %}
<!DOCTYPE html>
<html>
<body>
<div>替换前:{{ value }}</div>
<br>
<div>替换后:
{{ value | replace:'Python:Django' }}
</div>
</body>
</html>
2 Jinja2模板
2.1 安装与配置
1.pip install Jinja2
2.确认安装成功后在项目的Django文件夹中创建jinja2.py (可自命名),打开jinja2.py的类Environment进行实例化
from django.contrib.staticfiles.storage import staticfiles_storage
from django.urls import reverse
from jinja2 import Environment
# 将jinja2模版设置到项目环境
def environment(**options):
env = Environment(**options)
env.globals.update({
'static': staticfiles_storage.url,
'url': reverse,
})
return env
3.将jinja2.py文件定义的environment写道配置文件settings中。
TEMPLATES = [
# 使用Jinja2模版引擎
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [
os.path.join(BASE_DIR, 'templates'),
],
'APP_DIRS': True,
'OPTIONS': {
'environment': 'MyDjango.jinja2.environment'
},
},
# 使用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',
], },
},
]
6.2 模板语法
Jinja2模板设计人员帮助手册 jinja.pocoo.org/dos/2.10/