一、模板介绍与配置
模板的介绍
Django的模板是一个简单的文本文件,可以是任何文本格式,如HTML、XML、TXT等,推荐使用HTML格式。在Django中可以看做创建HTML页面的样本。包含静态的HTML和用于描述如何动态生成HTML的特殊语法两个部分。
模板的结构:
Django模板的结构与Html文件相似,甚至完全可以使用一个HTML文件作为模板。
Django使用模板引擎Django Template Language(往后统称DTL)与Jinja2对模板文件进行解释,一个Django工程可以配置一个或者多个模板引擎。如果项目中没有使用模板,那么也可以不配置模板引擎。
DTL
Django自带的模板系统叫做DTL,通过该引擎可以方便地加载模板文件并在内存中进行编译,然后插入动态数据,最后返回一个字符串。Django中很多内部组件都使用了DTL,例如admin,因此不建议放弃DTL
模板的配置
- 创建模板文件
在项目根目录下创建一个Templates的文件夹
设置模板语言为Django语言
使用多模板的情况
二、模板的加载与渲染
模板的加载
1.导入diango.template.loader.get_template
2.将模板文件夹之中的模板文件加载到视图之中
3.将加载后的模板进行传参后渲染到浏览器之中
加载模板
django.template.loader模块中提供了两个用于加载模板的方法:
-get_template ( template_name,using = None)
该方法使用给定的名称查找和加载模板,并返回一个Template对象。如果想使用指定的模板引擎进行查找,请将模板引擎的NAME赋给get_template的using参数。
select_template (template_name_list, using = None)
该方法接收一个模板名称的列表,返回第一个存在的Template对象。同样using参数用于改变模板引擎。
当找不到对应的模板时,这两个方法都会返回TemplateDoesNotExist异常。如果模板找到了,但是模板中存在语法错误,返回TemplateSyntaxError异常。
模板的渲染
Template.render(request=None, context=None)
参数说明:
context:需要展示到HTML文件上的数据集合,它是一个字典对象。如果render没有接受任何context,模板引擎就会直接渲染模板而不插入任何数据。
request:一个HttpRequest对象。不同的模板引擎对request对象的处理方式不同
注:模板的加载与渲染都是在视图 (view.py)中进行
具体操作
案例一:指定渲染模板
- 模板文件中创建几个HTMl文件
在视图函数中写上加载模板和渲染模板的视图函数
def template_view1(request): temp = get_template('One.html') # 将模板加载到视图中,直接将模板文件的文件名写入即可,不用添加路径,前提是模板文件夹在根目录中,模板文件在根目录中 res = temp.render(request=request, context=None) # 模板的渲染 return HttpResponse(res) # 返回响应到浏览器
运行过程
案例二:使用render方法将模板直接渲染并返回给浏览器
- 代码如下
def template_view2(request, path): return render(request=request, template_name=path) # 第一个参数仍然是传入模板文件的文件名
子应用中路由的配置
运行过程
三、模板语言
主要分为四大模块
1.变量
2.注释
3.标签
4.过滤器
变量
{{ 变量名 }} --> 模板语言中变量的表现形式,变量名就是context中的键名
模板语言,只能用于有DTL模板引擎渲染的项目之中,即只能由django进行渲染了之后,才来。
注意:当值为列表时,取值方法:{f变量名.下标}}
当值为字典时,取值方法:{{键名.键名}}
具体案例
- 视图的代码如下
def template_view1(request): temp = get_template('One.html') # 将模板加载到视图中,直接将模板文件的文件名写入即可,不用添加路径,前提是模板文件夹在根目录中,模板文件在根目录中 context = { 'name': '阿峰', 'age' : 20, 'like': ['read', 'listen', 'music', 'sport'], 'other': { 'game': 'LoL', 'watch': 'film' } } res = temp.render(request=request, context=context) # 模板的渲染 return HttpResponse(res) # 返回响应到浏览器
模板(HTML文件)中使用变量
运行过程
注释
1 . htm1的注释语法,这个注释会在前端源代码中呈现出来
2. {#注释2#}DTL的注释语法
3. {% comment %}内容{% endcomment %]}
comment标签之间的内容全部都会注释掉不管是{##}还是使用comment标签进行注释的时候,都不会在前端的源代码中呈现
标签
用法:
类似于{% tag %}。相对于变量来说标签更加复杂,标签可以用于输出文本、控制代码逻辑等。
有的标签还需要有开始标记和结束标记,这类标签的格式类似于
{% tag %}…{% endtag %}。
常用标签:
1.blobk:用于定义一个模板块,这个模板块能够被子模板重写
2.extends:用于标记当前模板继承自哪个父模板
3.comment:模板中的注释
4. for:循环遍历一个可迭代对象5. if:条件判断
6. with:为变量创建别名
案例一:常用标签的使用
案例二:自定义标签
1.在子应用中创建一个名为templatetags(必须为这个名字)的文件夹用于存放自定义标签的文件夹
2.创建用于定义自定义标签的py文件,以及一个__init__.py文件,该文件表示将所在目录视作一个可被导入的模块
4.实例化一个Library对象
注意,register变量名千万不要变,不要用其他的名字,就用register
5.定义实现自定义标签,以函数的形式
6.将设计好的自定义标签进行注册
7.在模板文件的开头写上{% load tags %},tags为自定义标签名,将自定义标签加载到模板文件中
具体实现步骤
- 在子应用中创建一个名为templatetags的文件夹
创建一个自定义标签文件和__init__文件
- 在mytag文件中写上函数
需要导入的模块:from django.template import Library
from django.template import Library register = Library() # register变量名不能变 @register.simple_tag() # 将自定义标签进行注册 def change_1(value): return 'haha' + value
在模板文件的开头位置加载自定义标签并使用
运行结果
过滤器
作用:过滤器可以用来修改变量的显示样式。
使用方式:
{{变量|过滤器方法}}。过滤器可以连续使用,形式如:f变量|过滤器方法1过滤器方法2}}。
如果过滤器需要参数,则使用冒号∵’传递参数。形式如:ff变量|过滤器:‘参数’}
注意:变量、管道符("I’)和过滤器方法之间不能有空格
常用过滤器:
safe,禁用转义,告诉模板这个变量是安全的,可以解释执行
length,长度,返回字符串包含字符的个数,或列表、元祖、字典的元素个数。
default,默认值,如果变量不存在时则返回默认值。 data ldefault:"默认值’
date,日期,用关于对日期类型的值进行字符串格式化- add,将参数添加到值中。
案例一:常用过滤器的使用
视图函数
在模板文件中使用常用过滤器
结果显示
案例二:自定义过滤器
- 在templatetags文件夹中创建一个自定义的过滤器py文件
在此文件中写上自定义的过滤器
from django.template import Library register = Library() @register.filter(name='str_add') def str_add(value): return value + ' very handsome' @register.filter(name='int_add') def int_add(value1, value2): print(value1) print(value2) return value1 + value2
将自定义的过滤器加载到模板文件中并使用
结果显示