Django之Django模板与Jinja2模板的使用
Django模板
Django中的模板是用来渲染HTML页面的工具。
基本特点:
语法简单: Django模板语法精简,十分易学。
变量: 在Django模板中,可以简单地使用变量来引用应用程序中的数据。
例如,可以使用 {{ variable_name }} 来呈现数据。
标签: Django模板中的标记(tag)用于执行诸如循环、条件语句和其他更高级操作等功能。
继承: 使用Django模板,可以轻松地实现一个基本的布局,然后在应用程序中的其他地方重用该布局。
过滤器 : 过滤器(filter)可以在呈现模板之前修改数据。
基本使用
配置模板目录
在工程中创建模板目录templates
,接着在settings.py
配置文件中修改TEMPLATES
配置项的DIRS
值,指定模板目录位置。
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'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',
],
},
},
]
定义模板
在templates
目录中新建一个模板文件,如index.html
。在模板中,使用{{ }}
语法访问变量。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>{{ user }}</h3>
<h3>{{ user.name }}</h3>
<h3>{{ address }}</h3>
<h3>{{ address.0 }}</h3>
</body>
</html>
模板渲染
通过loader.get_template
(模板文件在模板目录中的相对路径) 找到返回模板对象
使用模板对象.render(context=None, request=None)
进行渲染模板,然后返回渲染后的值
from django.http import HttpResponse
from django.template import loader
def index(request):
# 获取模板
template = loader.get_template('index.html')
context = {'user': {'name': '小白', 'age': 20}, 'address': [1, 2, 3]}
# 渲染模板
return HttpResponse(template.render(context))
或者使用Django提供的render函数简写,render(request对象, 模板文件路径, 模板数据字典)
from django.shortcuts import render
def index2(request):
context = {'user': {'name': '小白', 'age': 20}, 'address': [1, 2, 3]}
return render(request, 'index.html', context)
配置路由
在URLconf中定义一个URL模式,将URL映射到视图函数
urlpatterns = [
re_path('index/', views.index, name='index'),
]
测试
访问URL,即可看到渲染的index.html
模板页面
模板标签
Django的模板语法是一种简单且易于学习的语言,它使用一些特殊的标记和标签来创建动态HTML页面。
变量
在模板中使用双花括号来访问变量。当模板渲染时,它会将变量替换为其对应的值。
变量名必须由字母、数字、下划线(不能以下划线开头)和点组成。
欢迎您,{{ user.username }}!
注释
注释内容不会显示在最终生成的HTML中。注释可用于在模板中添加说明或注释。
单行注释
{# 单行注释 #}
多行注释使用comment标签
{% comment %}
多行注释
多行注释
多行注释
{% endcomment %}
FOR循环
for循环用于在模板中迭代数据,并将数据渲染到模板中。for循环使用{% %}括起来并包含一个嵌套的{{ }}变量。
{% for item in address %}
第{{ forloop.counter }}次循环,值: {{ item }} <br>
{% empty %}列表为空或不存在时执行
{% endfor %}
IF判断
if语句用于在模板中测试条件,并根据条件显示特定内容。if语句使用{% %}括起来。
{% if user.age == 20 %}
<a>age is 20</a>
{% elif user.age == 30 %}
<a>age is 30</a>
{% else %}
<a>age is null</a>
{% endif %}
{% if user.is_authenticated %}
您已登录!
{% else %}
请登录。
{% endif %}
运算符
运算符左右两侧不能紧挨变量或常量,必须有空格。
1.比较运算符
==
!=
<
>
<=
>=
2.布尔运算符
and
or
not
过滤器
过滤器用于修改变量的值,以便在渲染时呈现。它们以管道符号
|
分隔,并作为变量的后缀。
过滤器用于进行计算、转换操作,可以使用在变量、标签中。如果过滤器需要参数,则使用冒号
:
传递参数。
模板语法:
{{ 变量名 | 过滤器:可选参数 }}
基本使用:
显示大写的 my_var 值
{{ my_var|upper }}
过滤管道可以被套接 ,即:一个过滤器管道的输出又可以作为下一个管道的输入
将第一个元素并将其转化为大写
{{ my_list|first|upper }}
有些过滤器有参数。 过滤器的参数跟随冒号之后并且总是以双引号包含
显示变量my_var的前30个词
{{ my_var|truncatewords:"30" }}
其他过滤器:
lower : 大写转换小写
upper : 小写转换大写
title : 可以将字符串中首字母大写
safe : 禁用转义,告诉模板这个变量是安全的,可以解释执行
length : 长度,返回字符串包含字符的个数,或列表、元组、字典的元素个数。
{{ name|length}}
default : 默认值,可以为变量指定一个默认值,以便在变量未定义时显示。
data|default:'默认值'
date : 日期,可以将日期对象解析为时间格式。可以设置各种格式, 常用的格式化字符如下:
Y表示年,格式为4位,y表示两位的年。
m表示月,格式为01,02,12等。
d表示日, 格式为01,02等。
j表示日,格式为1,2等。
H表示时,24进制,h表示12进制的时。
i表示分,为0-59。
s表示秒,为0-59。
value|date:"Y年m月j日 H时i分s秒"
slice : 使用 slice 过滤器可以获取序列(列表,元组等)的一个子序列
{{ some_list|slice:"1:4" }}
join : 使用 join 过滤器可以将列表中的每个元素连接成一个字符串。
{{ some_list|join:" / " }}
继承和区块
继承和区块用于在不同的模板之间共享代码和结构。基本的继承语法使用{% extends %},而区块语法使用{% block %}和{% endblock %}。
父模板
如果发现在多个模板中某些内容相同,那么这些内容就可以定义到父模板中。
使用标签block进行定义,用于在父模板中预留区域,留给子模板填充差异性的内容。 为了可读性,建议给endblock标签写上名字,名字不能相同。父模板中也可以使用上下文中传递过来的数据。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% block header %}
<div>预留区域,可以是默认内容,也可以没有内容</div>
{% endblock header %}
{% block foot %}
<div>脚部默认区域</div>
{% endblock foot %}
</body>
</html>
子模板
子模板使用标签extends,写在子模板文件的第一行。子模版不用填充父模版中的所有预留区域,如果子模版没有填充,则使用父模版定义的默认值。
{% extends 'user/test.html' %}
{% block header %}
{{ block.super }}
{% endblock header %}
{% block foot %}
填充脚部区域
{% endblock foot %}
Jinja2模板
Jinja2是一个基于Python的、功能强大的Web模板引擎,其提供了许多有用的功能,如继承、条件渲染、迭代、宏、自动转义以及过滤器等。
django默认模板引擎功能不齐全,速度慢,jinja2宣称比django默认模板引擎快10-20倍。Django也支持jinja2。
安装jinja2模块
pip install jinja2
Jinja2模板引擎环境配置文件
在项目中创建 jinja2_env.py模板引擎环境配置文件
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
配置Jinja2模板引擎
在settings.py文件中配置Jinja2模板引擎,接着指定Jinja2模板引擎环境
TEMPLATES = [
{
# 1.将django模板引擎修改为jinja2
# 'BACKEND': 'django.template.backends.django.DjangoTemplates',
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
# 2.指定修改过的环境变量
# 'environment': 'jinja2.Environment',# 默认存在
'environment': 'demo.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',
],
},
},
]
使用Jinja2模板
定义一个视图
from django.http import HttpResponse
from django.template import loader
def index1(request):
# 获取模板
template = loader.get_template('user/index.html')
context = {'user': {'name': '小白', 'age': 20}}
# 渲染模板
return HttpResponse(template.render(context))
Jinja2模板的模板语法与Django自带的模板使用语法类似。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ user.name }}
<br>
{{ user.age }}
</body>
</html>
Jinja2过滤器
Jinja2提供了大量的过滤器来处理和转换模板变量
safe过滤器可以标记内容是安全的,即内容不应被转义或修改。
{{ var|safe }}
capitalize过滤器可以将文本的第一个字符大写。
{{ var|capitalize }}
lower过滤器可以将文本全部转换为小写。
{{ var|lower }}
upper过滤器可以将文本全部转换为大写。
{{ var|upper }}
title过滤器可以将单词的首字母转换为大写,而其他字符转换为小写。
{{ var|title }}
truncate过滤器可以将文本截断为指定长度,并在末尾添加省略号。
{{ var|truncate(20) }}
escape过滤器可以实现HTML、XML和URL的转义。
{{ var|escape }}
join过滤器可以将列表中的元素连接起来。
{{ var|join(', ') }}
default过滤器可以在值为空或不存在时提供一个默认值,避免出现模板错误。
{{ var|default('no value') }}
dictsort过滤器可以按字典顺序排序列表中的字典,也可以反转顺序。
{{ var|dictsort }}
自定义过滤器
Jinja2提供了一些内建的过滤器,同时也可以自定义过滤器
在jinja2_env.py文件中自定义过滤器
from jinja2 import Environment
def environment(**options):
# 创建env实例
env = Environment(**options)
# 将自定义的过滤器添加到环境中
# myFilterFun是过滤器函数,myFilter是过滤器名称
env.filters['myFilterFun'] = myFilter
return env
# 自定义过滤器
def myFilter(val):
if val == "Python":
return "OK"
else:
return val
注释使用django原模板的admin应用及路由,否则将出现如下异常:
ERRORS:
?: (admin.E403) A 'django.template.backends.django.DjangoTemplates' instance must be configured in TEMPLATES in order to use the admin application.
INSTALLED_APPS = [
# 'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 添加注册子应用
'user.apps.UserConfig',
]
from django.urls import include, path
urlpatterns = [
# path('admin/', admin.site.urls),
# 配置只要是/user路径则匹配成功
# path('user/', include('user.urls')),
path('user/', include(('user.urls', 'user'), namespace='user'))
]
使用过滤器
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ "Python" | myFilterFun }}
<br>
{{ "Java" | myFilterFun }}
</body>
</html>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136839.html