hello!我是小J,每天一个小知识,一起学python,让技术无限发散。
模板
- 1. 模板配置
- 1.1 模板简介
- 1.2 模板的使用流程
- 1.3 模板配置
- 2. 模板使用
- 2.1 变量
- 2.2 深度变量查找
- 3. 模板过滤器的使用
- 4. 模板标签
- 5. 模板的继承
- 结束语
模板:一组拥有相同或相似的页面,在需要进行个性化升级的地方留白,需要的时候采用数据填充就可以使用;HTML 这种文件的类型我们叫模板
1.2 模板的使用流程- 模板的处理分为两个过程
①加载
② 渲染
在django的模板的使用过程中需要将模板先进行加载,在通过render()进行模板的渲染。django提供了模板,提供模板的目的是为了方便页面的开发,然后再通过渲染的方式,将HTML返回给客户端(浏览器),可以更加直观的将后端的数据展示到HTML中方便用户理解和查看。在django中是通过视图的方式使用render()来渲染模板,render()每次只能用一个模板
- render()方法参数说明
- render(request, template_name, context=None, content_type=None, status=None, using=None)
首先需要在根目录下创建一个template文件夹
在setting.py文件中进行相应的配置
代码:
# 模板 配置模板信息
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'template'],
'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',
],
},
},
]
2. 模板使用
2.1 变量
-
模板的语法:{{ 变量名 }}
Django 模板解析非常快捷,大部分的解析工作都是在后台通过对简短正则表达式一次性调用来完成。 这和基于 XML 的模板引擎形成鲜明对比,那些引擎承担了 XML 解析器的开销,且往往比 Django 模板渲染引擎要慢上几个数量级。 -
先写一个视图函数:
def runoob(request):
#准备数据,渲染到模板上
# 字符串
views_name = 'python data'
# 列表
views_list = ['教程1','教程2','教程3']
# 字典
views_dict = {"name":"wky","age":18}
context = {
'views_name':views_name,
'views_list':views_list,
'views_dict':views_dict
}
# 将数据渲染到模板中显式
return render(request,'index5.html',context={'views_name':views_name})
- 模板index5
模板的使用
{ views_name }} views_name = context={'views_name':views_name}中的key -->
{{ views_name }}
{{ views_name }}的views_name是视图函数中render()参数context默认字典的key
- 路由:path('runoob/',views.runoob)
- 通过http://127.0.0.1:8000/runoob/,结果:
-
语法 {{ var_name.xxxx }}
之前我么传入的是单纯的字符串,直接使用{{ views_name }}就实现了数据的渲染,接下来我们将传入列表和字典型的数据进行深度变量的查找。 -
视图函数
ef runoob(request):
#准备数据,渲染到模板上
# 字符串
views_name = 'python data'
# 列表
views_list = ['教程1','教程2','教程3']
# 字典
views_dict = {"name":"wky","age":18}
context = {
'views_name':views_name,
'views_list':views_list,
'views_dict':views_dict
}
# 将数据渲染到模板中显式
return render(request,'index5.html',context={'context':context})
- 模板
模板的使用
{ views_name }} views_name = context={'views_name':views_name}中的key -->
{{ context.views_name }}
{{ context.views_list }}
{{ context.views_dict }}
- 通过http://127.0.0.1:8000/runoob/,结果:
模板中的过滤器:过滤器作用是在变量输出时,对输出的变量值做进一步的处理,过滤器通过管道的字符使用“|”。过滤器跟模板标签一样,也是在模板中对函数进行调用,比如,对输出的日期进行格式化处理,或者转换大小写字母等,这些都有对应的过滤器去处理它们。
如果内置的过滤器不能够满足需求,可以自定义过滤器,过滤器的语法格式:
python {{ 变量 | 过滤器1:参数值1 | 过滤器2:参数值2 ... }}
- 丰富视图函数
def runoob(request):
#准备数据,渲染到模板上
# 字符串
views_name = 'python data'
# 列表
views_list = ['教程1','教程2','教程3']
# 字典
views_dict = {"name":"wky","age":18}
# 大小
num = 2048
# 日期
import datetime
now = datetime.datetime.now()
context = {
'views_name':views_name,
'views_list':views_list,
'views_dict':views_dict,
'num':num,
'now':now,
'value':[{'name': 'C语言中文网', 'num':2 },
{'name': 'Django官网', 'num': 1},
{'name': 'Python官网', 'num': 3},],
'books': [{'title': 'C语言教程', 'author': {'name': 'ycs', 'age': 14}},
{'title': 'Python教程', 'author': {'name': 'xxw', 'age': 17}},
{'title': 'Django教程', 'author': {'name': 'ccs', 'age': 16}},]
}
# 将数据渲染到模板中显式
return render(request,'index5.html',context={'context':context})
- 丰富模板
{ views_name }} views_name = context={'views_name':views_name}中的key -->
{{ context.views_name |length }}
{{ context.views_list |last|upper }}
{{ context.views_dict| length }}
{{ context.num|filesizeformat }}
{{ context.now | date:"Y-m-d H:s" }}
{{ context.value| dictsort:"num" }}
{{ context.books| dictsort:"author.age" }}
- 通过http://127.0.0.1:8000/runoob/,结果:
django官方提供了不只if和for这样的模板标签,还提供了很多可以让我们在模板页面上实现之前只能在后台进行逻辑实现的功能标签。
标签语法(模板标签是成对出现的
):
{% var_name %}
comment
{% endvar_name %
- 简单的标签使用
def runoob(request):
#准备数据,渲染到模板上
# 字符串
views_name = 'python data'
# 列表
views_list = ['教程1','教程2','教程3']
# 字典
views_dict = {"name":"wky","age":18}
# 大小
num = 2048
# 日期
import datetime
now = datetime.datetime.now()
context = {
'views_name':views_name,
'views_list':views_list,
'views_dict':views_dict,
'num':num,
'now':now,
'value':[{'name': 'C语言中文网', 'num':2 },
{'name': 'Django官网', 'num': 1},
{'name': 'Python官网', 'num': 3},],
'books': [{'title': 'C语言教程', 'author': {'name': 'ycs', 'age': 14}},
{'title': 'Python教程', 'author': {'name': 'xxw', 'age': 17}},
{'title': 'Django教程', 'author': {'name': 'ccs', 'age': 16}},]
}
# 将数据渲染到模板中显式
# return render(request,'index5.html',context={'context':context})
return render(request,'index6.html',context={'context':context})
- 模板index6
{% if context.views_name %}
{{ context.views_name }}
{% else %}}
no
{% endif %}
{% for books in context.books %}
- 通过http://127.0.0.1:8000/runoob/,结果:
模板的继承主要用于网站的头部和底部,这种地方一般都是有相同的页面显示的地方我们可以使用模板来进行继承,从而减少我们开发的时间,提高效率。
- 编写两个模板
- temp3.html 做被继承的模板(父模板),使用{% block %}添加内容
父模板
---------头部----------
{% block qs %}
这是区域1
这是区域2
这是区域3
这是区域4
{% endblock qs %}
---------底部----------
- temp4.html 做子模板(继承的),使用{% extends 'temp3.html' %}继承temp3
{% extends 'temp3.html' %}
子模版
桃之夭夭,灼灼其华。之子于归,宜其室家。
桃之夭夭,有蕡其实。之子于归,宜其家室。
桃之夭夭,其叶蓁蓁。之子于归,宜其家人。
- 视图函数
def test(request):
return render(request,'temp4.html')
-
路由 :path('test/',views.test),
-
通过http://127.0.0.1:8000/test/,我们访问到了父模板
为啥我们在temp4中的内容没有现实,这里需要我们使用{% block qs %}和{% endblock %}进行添加内容
{% block qs %}
桃之夭夭,灼灼其华。之子于归,宜其室家。
桃之夭夭,有蕡其实。之子于归,宜其家室。
桃之夭夭,其叶蓁蓁。之子于归,宜其家人。
{% endblock %}
- 结果
可以看到,temp4继承了temp3的头部和底部,那如果要将我们之前输入的区域都显示出来,需要使用{{ block.super }}来继承父类的内容
{% block qs %}
桃之夭夭,灼灼其华。之子于归,宜其室家。
桃之夭夭,有蕡其实。之子于归,宜其家室。
桃之夭夭,其叶蓁蓁。之子于归,宜其家人。
{{ block.super }}
{% endblock %}
- 结果:
更多常见的模板标签、继承和过滤器可以参考:https://docs.djangoproject.com/en/2.2/ref/templates/builtins/
结束语
本文属于作者原创,转载请注明出处,不足之处,希望大家能过给予宝贵的意见,如有侵权,请私信。每天一个小知识,一起学python,让技术无限发散



