-
作为Web框架,Django提供了模板,用于编写html代码,还可以嵌入模板代码更快更方便的完成页面开发,再通过在视图中渲染模板,将生成最终的html字符串返回给客户端浏览器
-
模板致力于表达外观,而不是程序逻辑
-
模板的设计实现了业务逻辑
view
与显示内容template
的分离,一个视图可以使用任意一个模板,一个模板可以供多个视图使用 -
模板包含两部分:
静态部分,包含html、css、js
动态部分,就是模板语言
-
Django处理模板分为两个阶段:
加载:根据给定的路径找到模板文件,编译后放在内存中。
渲染:使用上下文数据对模板插值并返回生成的字符串。 -
为减少重复编写加载、渲染的代码,Django提供了简写函数
render()
,用于调用模板。
Django模板语言(DTL)
- 定义在
django.template
包中 - 模板语言包括4种类型,分别是:
模板变量、模板标签、模板过滤器、模板注释
模板变量
模板变量的用来显示从服务端传递过来的数据
-
语法格式:
HTML页面:{{ 变量名 }}
视图处理函数:return render(request, 'HTML页面', 字典数据)
-
变量名,使用字典数据中的键作为变量名
-
获取不同类型的数据
数字类型:{{ 变量名 }}
字符串类型:{{ 变量名 }}
列表类型:{{ 变量名.下标 }}
字典类型:{{ 变量名.键 }}
对象类型:{{ 变量名.属性 }}
-
如果变量不存在时,显为空字符串
-
在模板中可以调用方法,但不能传递参数
实例演练: 将字典值传递给页面
- 修改urls.py文件:
url(r'^temp_var/$', views.temp_var),
- 修改views.py文件:
def temp_var(request):
dict = {'title': '字典键值'}
book = BookInfo()
book.btitle = '对象属性'
context = {'dict': dict, 'book': book}
return render(request, 'app/temp_var.html', context)
- 在
templates/app
目录中添加页面文件temp_var.html
<body>
模板变量:<br/>
{{ dict.title }}<br/>
{{ book.btitle }}<br/>
</body>
- 在浏览器中查看结果
![](https://img.haomeiwen.com/i15420318/5074ef328d7b93f4.png)
课堂练习:
- 创建一个查询页面
searchbook.html
,用来输入图书的名字 - 将对应的图书信息显示在
bookinfo.html
页面上 - 假设查询到的图书只有一本
- searchbook.html
<body>
<form action="/app/dosearchbook/", method="post">
请输入书名:<input type="text" name="bookname">
<br>
<input type="submit">
</form>
</body>
- bookinfo.html
<body>
书名:{{ book.btitle }} <br>
出版日期:{{ book.bpub_date }} <br>
阅读数:{{ book.bread }} <br>
</body>
- searchbook
def searchbook(request):
return render(request, 'app/searchbook.html')
- dosearchbook
def dosearchbook(request):
bookname = request.POST.get('bookname') # 用户输入的书名
book = BookInfo.bookm.get(btitle=bookname) # 根据用户输入的书名查询DB,得到图书对象
content = {
'book': book,
}
return render(request, 'app/bookinfo.html', content)
- urls
url(r'^searchbook/$', views.searchbook),
url(r'^dosearchbook/$', views.dosearchbook)
模板标签
语法格式:{% 代码段 %}
-
for
标签语法格式:
{% for item in 列表 %}
循环逻辑
{{ forloop.counter }}表示当前是第几次循环,从1开始
{% empty %}
列表为空或不存在时执行此逻辑
{% endfor %}
-
if
标签语法格式:
{% if 条件1 %}
逻辑1
{% elif 条件2 %}
逻辑2
{% else %}
逻辑3
{% endif %}
-
比较运算符:
==
、!=
、<
、>
、<=
、>=
注意: 运算符左右两侧不能紧挨变量或常量,必须有空格。 -
逻辑运算符:
and
、or
、not
实例演练: 在页面上显示图书列表
- 修改urls.py文件:
url(r'^temp_book/$', views.temp_book),
- 修改views.py文件:
def temp_book(request):
context = {'list': BookInfo.objects.all()}
return render(request, 'app/temp_book.html', context)
- 在
templates/app
目录中添加页面文件temp_book.html
<body>
图书列表如下:
<ul>
{% for book in list %}
{% if book.id <= 2 %}
<li style="color: red;">{{ book.btitle }}</li>
{% elif book.id <= 3 %}
<li style="color: blue;">{{ book.btitle }}</li>
{% else %}
<li style="color: green;">{{ book.btitle }}</li>
{% endif %}
{% empty %}
<li>对不起,没有图书</li>
{% endfor %}
</ul>
</body>
- 在浏览器中查看结果
![](https://img.haomeiwen.com/i15420318/a392ce6077b2d016.png)
模板过滤器
使用过滤器对变量进行计算、格式转换等操作
-
语法格式:
变量|过滤器:参数
-
常用过滤器:
length
,返回字符串包含字符的个数,或列表、元组、字典的元素个数。
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。
实例演练: 对书名大于4个字符的图书,格式化其出版时间
- 修改urls.py文件:
url(r'^temp_filter/$', views.temp_filter),
- 修改views.py文件:
def temp_filter(request):
context = {'list': BookInfo.objects.all()}
return render(request, 'app/temp_filter.html', context)
- 在
templates/app
目录中添加页面文件temp_filter.html
<body>
图书列表如下:
<ul>
{% for book in list %}
{% if book.btitle|length > 4 %}
<li style="color: red;">
{{ book.btitle }}
---默认时间格式为:
{{ book.bpub_date }}
</li>
{% else %}
<li style="color: green;">
{{ book.btitle }}
---格式化时间为:
{{ book.bpub_date|date:"Y-m-j" }}
</li>
{% endif %}
{% endfor %}
</ul>
</body>
- 在浏览器中查看结果
![](https://img.haomeiwen.com/i15420318/4ee735451f9d4f72.png)
模板注释
- 在模板中使用如下模板注释,这段代码不会被编译,不会输出到客户端
- html注释只能注释html内容,不能注释模板语言。
- 单行注释语法格式:
{#...#}
,注释可以包含任何模版代码,有效的或者无效的都可以。 - 多行注释使用
comment
标签,语法格式:
{%comment%}
...
{%endcomment%}
- end -
网友评论