4.模板引擎
1 变量
在 Django 模板中遍历复杂数据结构的关键是句点字符, 语法:
{{var_name}}
demo.py
l=[111,222,333]
dict1={"name":"yuan","age":18}
class Person(object):
def __init__(self,name):
self.name=name
person_yuan=Person("yuan")
person_egon=Person("egon")
person_alex=Person("alex")
person_list=[person_yuan,person_egon,person_alex]
demo.html
{{ l.0 }}
{{ dict.name.upper }}
{{ person_list.0.name }}
注意: 句点符也可以用来引用对象的方法 (无参数方法)
2 过滤器
{{obj|filter__name:param}}
名称 | 含义 | 用法 | 补充 |
---|---|---|---|
default | 如果一个变量是 false 或者为空,使用给定的默认值.否则使用变量的值 | {{ value|default:“no”}} | |
length | 返回值的长度,它对字符串和列表都起作用 | {{ value|length }} | 如果 value 是 [‘a’, ‘b’, ‘c’, ‘d’],那么输出是 4。 |
filesizeformat | 将值格式化为一个"人可读的”文件尺寸 | {{ value|filesizeformat }} | 如果 value 是 123456789,输出将会是 117.7 MB |
date | 根据给定的格式设置日期 | {{ value|date:“Y-m-d” }} | |
slice | 对value进行切片操作 | {{ value|slice:“2:-1” }} | |
truncatechars | 如果字符串字符多于指定的字符数量,那么会被截断.截断的字符串将以可翻译的省略号序(“…”)结尾 | {{ value|truncatechars:9 }} | |
safe | 标记一个字符串在输出前不需要进一步的 HTML 转义 | {{ value|safe }} |
3 模板之标签
1.for
遍历每一个元素:
# 正向循环
{% for person in person_list %}
<p>{{ person.name }}</p>
{% endfor %}
# 反向循环
{% for obj in list reversed %}
<p>{{ person.name }}</p>
{% endfor %}
遍历一个字典:
{% for key,val in dic.items %}
<p>{{ key }}:{{ val }}</p>
{% endfor %}
注:循环序号可以通过{{ forloop }}显示
变量名 | 描述 |
---|---|
forloop.counter | 循环计数器,表示当前循环的索引(从 1 开始) |
forloop.counter0 | 循环计数器,表示当前循环的索引(从 0 开始) |
forloop.revcounter | 反向循环计数器(以最后一次循环为 1 ,反向计数) |
forloop.revcounter0 | 反向循环计数器(以最后一次循环为 0 ,反向计数) |
forloop.first | 当前循环为首个循环时,该变量为 True |
forloop.last | 当前循环为最后一个循环时,该变量为 True |
2.for … empty
for 标签带有一个可选的 {% empty %} 从句,以便在给出的组是空的或者没有被找到时,可以有所操作
{% for person in person_list %}
<p>{{ person.name }}</p>
{% empty %}
<p>sorry,no person here</p>
{% endfor %}
3.if
{% if %} 会对一个变量求值,如果它的值是 “True”(存在、不为空、且不是 boolean 类型的 false 值),对应的内容块会输出。
{% if num > 100 or num < 0 %}
<p>无效</p>
{% elif num > 80 and num < 100 %}
<p>优秀</p>
{% else %}
<p>凑活吧</p>
{% endif %}
4.with
使用一个简单地名字缓存一个复杂的变量,当你需要使用一个 “昂贵的” 方法(比如访问数据库)很多次的时候是非常有用的
例如:
{% with total=business.employees.count %}
{{ total }} employee{{ total|pluralize }}
{% endwith %}
5.csrf_token
这个标签用于跨站请求伪造保护
{% csrf_token %}
6.include
view.py
return render(request,'demo.html',{person:"Jane" greeting:"Hello"})
base.html
{{ greeting }}, {{ person|default:"friend" }}!
demo.html
{% include "base.html" with person=person greeting=greeting %}
7.exclude
1.语法:
{% block 名称 %}
#调用父类
{{ block.super }}
....
{% endblock 名称 %}
jinja2中调用父类的方法{{ super() }}
2.例子
base.html
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="style.css" />
<title>{% block title %}My amazing site{%/span> endblock %}</title>
</head>
<body>
<div>
{% block content %}{% endblock %}
</div>
</body>
</html>
demo.html
{% extends "base.html" %}
{% block title %}{{ block.super }} My amazing blog{% endblock %}
{% block content %}hello{% endblock %}
输出
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="style.css" />
<title>My amazing site My amazing site</title>
</head>
<body>
<div>
hello
</div>
</body>
</html>
8.load
加载一个自定义模板标签集
{% load somelibrary package.otherlibrary %}
{% load foo bar from somelibrary %}
4 自定义标签和过滤器
1.在项目app中创建名为 templatetags的包 (包名只能是 templatetags)
2.在templatetags包中创建任意 .py 文件,如:my_tags.py
注意:
在 settings 中的 INSTALLED_APPS 配置当前 app,不然 django 无法找到自定义的标签
my_tags.py
from django import template
from django.utils.safestring import mark_safe
#register的名字是固定的,不可改变
register = template.Library()
#自定义过滤器
@register.filter
def filter_multi(v1,v2):
return v1 * v2
#自定义标签:方式一
@register.simple_tag
def my_input(id,arg):
result = "" %(id,arg,)
return mark_safe(result)
#自定义标签:方式二
@register.inclusion_tag("base/content_list.html")
def get_content_list(article_list):
return {"article_list": article_list}
content_list.html
<div class="article_list">
{% for article in article_list %}
<div class="article-item clearfix">
<h5><a href="/blog/{{ article.user.username }}/articles/{{ article.pk }}">{{ article.title }}</a></h5>
<div class="article-desc">
{{ article.desc }}
</div>
<div class="small pub_info pull-right">
<span>发布于 {{ article.create_time|date:"Y-m-d H:i" }}</span>
<span class="glyphicon glyphicon-comment"></span>评论({{ article.comment_count }})
<span class="glyphicon glyphicon-thumbs-up"></span>点赞({{ article.up_count }})
</div>
</div>
<hr>
{% endfor %}
</div>
demo.html
# 在使用自定义标签和过滤器的html文件中导入之前创建的my_tags.py
{% load my_tags %}
# 自定义过滤器
# num=12
{{ num|filter_multi:2 }}
{{ num|filter_multi:"[22,333,4444]" }}
{% if num|filter_multi:30 > 100 %}
{{ num|filter_multi:30 }}
{% endif %}
# 自定义标签:方式一
{% simple_tag_multi 2 5 %}
{% simple_tag_multi num 5 %}
# 自定义标签:方式二
{% get_content_list article_list %}
注意: 自定义过滤器 可以用在 if 等语句后,自定义标签 不可以
5.Jinja2
Jinja2是 Python 下一个被广泛应用的模板引擎,是由Python实现的模板语言,他的设计思想来源于 Django 的模板引擎,并扩展了其语法和一系列强大的功能,尤其是Flask框架内置的模板语言,jinja2宣称比django默认模板引擎快10-20倍,且对Django的兼容性好
1.jinja2的引用
1.安装
pip install jinja2
2.在Django\mysite\目录下新建jinja2_env.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
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.编辑Django\mysite\mysite\settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',#修改1
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS':True,
'OPTIONS':{
'environment': 'jinja2_env.environment',# 修改2
'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 jinja2 import Environment
def environment(**options):
env = Environment(**options)
# 2.将自定义的过滤器添加到环境中
env.filters['do_listreverse'] = do_listreverse
return env
# 1.自定义过滤器
def do_listreverse(li):
if li == "B":
return "哈哈"
注意:
1.jinja2不能自定义标签,可以使用宏来实现
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix