第四篇Django之模板语言
Django之模板语言#
一 模板的执行#
模板的创建过程,对于模板,其实就是读取模板(其中嵌套着模板的标签),然后将Model中获取的数据插入到模板中,最后将信息返回给用户
def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html) 直接放在views里
二 模板语言#
2.1 变量 #
只需要记两种特殊符号
{{ }} 变量相关 {% %} 逻辑相关
示例一:显示一个基本的字符串在网页上
views.py
def text_str(resquest): str = '我在学习Django' return render(resquest, 'home.html', {'str': str})
home.html
{{ str }}
2.2 Django模板中的for循环标签#
示例二(1):基本的for循环和list的内容
views.py
def text_list(resquest): list=['HTML','CSS','jquery','MySQL','python','Django'] return render(resquest, 'home.html', {'list': list})
home.html
{{ list }} 得到一个列表 ================================================= {% for i in list %} {{ i }} 得到具体的值 {% endfor %}
示例二(2):dict的内容
views.py
def text_dic(resquest): dic={1:'HTML',2:'CSS'} return render(resquest, 'home.html', {'dic':dic})
home.html
{{ dic.1 }} ---------- dic.key
在模板中取字典的键用点 dic.1 而不是Python中的 dic['1']
还可以这样遍历字典:
for key,value in dic.items %} {{ key }}:{{ value }} {% endfor %}{%
其实就是在遍历这样一个list:[(1,'HTML')(2,'CSS')]
示例三 在模板进行 条件判断和for循环的详细操作
views.py
def text_for(request): List = map(str, range(100))# 一个长度为100的 List return render(request, 'home.html', {'List': List})
home.html
不加任何符号
for item in List %} {{ item }} {% endfor %}{%

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
加一个逗号
for item in List %} {{ item }}, {% endfor %}{%

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
我们会发现最后一个元素后面也有一个逗号,这样肯定不爽,如何判断是不是遍历到了最后一个元素了呢?
用变量 forloop.last 这个变量,如果是最后一项其为真,否则为假,更改如下:
for item in List %} {{ item }}{% if not forloop.last %},{% endif %} {% endfor %}{%
Variable | Description |
forloop.counter | 当前循环的索引值(从1开始) |
forloop.counter0 | 当前循环的索引值(从0开始) |
forloop.revcounter | 当前循环的倒序索引值(从1开始) |
forloop.revcounter0 | 当前循环的倒序索引值(从0开始) |
forloop.first | 当前循环是不是第一次循环(布尔值) |
forloop.last | 当前循环是不是最后一次循环(布尔值) |
forloop.parentloop | 本层循环的外层循环 |
示例四 (1) 当列表中可能为空时用 for ...empty
{% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% empty %} <li>抱歉,列表为空</li> {% endfor %} </ul><ul>
(2) if,elif 和 else
if user_list %} 用户人数:{{ user_list|length }} {% elif black_list %} 黑名单数:{{ black_list|length }} {% else %} 没有用户 {% endif %}{%
(3)当然也可以只有if和else
if user_list|length > 5 %} 七座豪华SUV {% else %} 黄包车 {% endif %}{%
2.3 Django模板中的条件判断标签#
示例五 if语句支持==、>、<、!=、<=、>=判断
if var >= 90 %} 成绩优秀 {% elif var >= 80 %} 成绩良好 {% elif var >= 70 %} 成绩一般 {% elif var >= 60 %} 需要努力 {% else %} 不及格啊,大哥!多学习啊! {% endif %}{%
(注意:比较符号前后必须有至少一个空格!)
and, or, not, in, not in 也可以在模板中使用
假如我们判断 num 是不是在 0 到 100 之间:
if num <= 100 and num >= 0 %} num在0到100之间 {% else %} 数值不在范围之内! {% endif %}{%
我们判断‘某某’在你不在一个列表中
if '某某' in List %} 某某在名单中 {% endif %}{%
示例六 模板上得到视图对应的网址
# views.py def add(request, a, b): c = int(a) + int(b) return HttpResponse(str(c))# urls.py
urlpatterns = patterns('',
url(r'^add/(\d+)/(\d+)/$', 'app.views.add', name='add'),
)# template html
{% url 'add' 4 5 %}
这样网址上就会显示出:/add/4/5/ 这个网址,假如我们以后修改 urls.py 中的
'^add/(\d+)/(\d+)/$'r
这一部分,改成别的,比如
'^jiafa/(\d+)/(\d+)/$'r
这样,我们不需要再次修改模板,当再次访问的时候,网址会自动变成 /jiafa/4/5/
示例七 取别名
两种方法
①
'some-url-name' arg arg2 as the_url %}{% url<a href="{{ the_url }}">链接到:{{ the_url }}</a>
②
} {{ total }} employee{{ total|pluralize }} {% endwith %}{% with total=business.employees.count %
实例八,模板中 获取当前网址,当前用户等:
8.1 获取当前用户
{{ request.user }}
如果登陆就显示内容,不登陆就不显示内容
if request.user.is_authenticated %} {{ request.user.username }},您好! {% else %} 请登陆,这里放登陆链接 {% endif %}{%
8.2.1 获取当前网址
{{ request.path }}
8.2.2 获取当前 GET 参数
{{ request.GET.urlencode }}
8.2.3 合并到一起用的一个例子
"{{ request.path }}?{{ request.GET.urlencode }}&delete=1">当前网址加参数 delete</a><a href=
比如我们可以判断 delete 参数是不是 1 来删除当前的页面内容
2.4 Django模板中的过滤器(Filters)的使用#
语法:
{{ name|lower }}
示例
views.py
def home(request): name = ['HTML','CSS','jquery','MySQL','python','Django'] return render(request, 'home.html', {'name': name})
home.html
{{ name|lower}}
=========================
其他用法#
1 default#
语法:
"nothing"}}{{ value:default:
views.py
def home(request): name2 = [] return render(request, 'home.html', {'name': name})
home.html
"nothing"}}{{ name:default:
2 length #
语法:
{{ value|length }}
views.py
def home(request): name = ['HTML','CSS','jquery','MySQL','python','Django'] return render(request, 'home.html', {'name': name})
home.py
{{ name|length }}
'|'左右没有空格没有空格没有空格
3 filesizeformat #
将值格式化成为一个‘人类可读的’文件尺寸(例如‘13KB’,'4,1MB',等待)
语法:
{{ value|filesizeformat }}
views.py
def home(request): name = 123456789 return render(request, 'home.html', {'name': name})
home.py
{{ name|filesizeformat }}
4 slice切片#
语法:
"2:-1"}}{{value|slice:
views.py
def home(request): name = ['HTML','CSS','jquery','MySQL','python','Django'] return render(request, 'home.html', {'name': name})
home.py
'0:4' }}{{ name|slice:
5 data #
语法:
"Y-m-d H:i:s"}}{{ value|date:
views.py
import datetimedef home(request):
name = datetime.datetime.now()
return render(request, 'home.html', {'name': name})
home.py
'Y-m-d' }}{{ name|date:
6 safe #
Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义
语法:
{{ value|safe}}
views.py
def home(request): value = "<a href='https://www.baidu.com/'>点我</a>" return render(request, 'home.html', {'value': value})
home.py
{{ value|safe}}
7 truncatechars
如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。
参数:截断的字符数
语法:
{{ value|truncatechars:9}}
views.py
def home(request): value = "2018年3月28日外交部发言人" return render(request, 'home.html', {'value': value})
home.py
{{ value|truncatechars:9}}
8 自定义fllter
① 在app中创建templatetags 文件夹 (必须的)
②创建任意的 .py 文件,如:my_tags.py
from django import template register = template.Library() #register的名字是固定的,不可改变 @register.filter() def filter_multi(v1,v2): return v1 * v2
③在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py :{% load my_tags %}
④views.py里
def home(request): num=12 return render(request, 'home.html', {'num': num})
⑤ 使用simple_tag和filter(如何调用)
.html {% load xxx %} #首行 # num=12 {{ num|filter_multi:2 }} #24-------------------------------
⑥
在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.
注意:
filter可以用在if等语句后,simple_tag不可以
if num|filter_multi:30 > 100 %} {{ num|filter_multi:30 }} {% endif %}{%
===simple_tag===
my_tags.py
from django import template register = template.Library()@register.simple_tag()
def simple_tag_multi(v1,v2,v3):
return v1v2v3
views.py
def home(request): return render(request, 'home.html')
home.html
}{% load my_tags %{% simple_tag_multi 2 5 2%}
9 csrf_token#
这个标签用于跨站请求伪造保护。
在页面的form表单里面写上{% csrf_token %}
例子:钓鱼网站
10 注释#
# ... #}{
三 母板 #
"en"> <head> <meta charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Title</title> {% block page-css %}<!DOCTYPE html> <html lang={% endblock %}
</head>
<body><h1>这是母板的标题</h1>
{% block page-main %}
{% endblock %}
<h1>母板底部内容</h1>
{% block page-js %}{% endblock %}
</body>
</html>
注意:我们通常会在母板中定义页面专用的CSS块和JS块,方便子页面替换。
继承母板#
在子页面中在页面最上方使用下面的语法来继承母板
'layouts.html' %}{% extends
块 #
通过在母版中使用 {%block xxx%} 来定义‘块’
在子夜中通过定义母版中的block名来对应替换母版中相应的内容
母版html里
}{% block page-main %{% endblock %}
对应的html
} <p>世情薄</p> <p>人情恶</p> <p>雨送黄昏花易落</p> {% endblock %}{% block page-main %
组件 #
可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方按如下语法导入即可
'navbar.html' %}{% include
配置css/js 文件时#
母版html
} --------------------------------------------------------------- {% block page-js %}{% endblock %}{% block page-css %}{% endblock %
相应的html
} <link href="/static/css/dashboard.css" rel="stylesheet"> {% endblock %} ------------------------------------------------------------ {% block page-js %} <script src="/static/jquery-3.2.1.min.js"></script> {% endblock %}{% block page-css %
静态文件相关#
导入文件#
} <img src="{% static "img/img/sms.ivo" %}">{% load static %
导入JS文件使用 #
} <script src="{% static "mytest.js" %}"></script>{% load static %
某个文件多处被用到可以存为一个变量#
} {% static "images/hi.jpg" as myphoto %} <img src="{{ myphoto }}"></img>{% load static %
另一种方法get_static_prefix #
} <img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />{% load static %
或者
} {% get_static_prefix as STATIC_PREFIX %}{% load static %<img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" />
<img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!" />
inclusion_tag#
示例
templatetags/my_inclusion.py
from django import template register = template.Library()@register.inclusion_tag('result.html')
def show_results(n):
# 三元运算
n = 1 if n < 1 else int(n)
data = ["第{}项".format(i) for i in range(1, n+1)].....//[第1项,第2项]
return {"data": data}
templates/snippets/result.html
{% for i in data %} <li>{{ i }}</li> {% endfor %} </ul><ul>
templates/index.html
}{% load inclusion_tag_test %{% show_results 10 %}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现