模板引擎是一种可以让开发者把服务端数据填充到html网页中完成渲染效果的技术。它实现了把前端代码和服务端代码分离的作用,让项目中的业务逻辑代码和数据表现代码分离,让前端开发者和服务端开发者可以更好的完成协同开发。
静态网页:页面上的数据都是写死的,万年不变
动态网页:页面上的数据是从后端动态获取的(比如后端获取当前时间;后端获取数据库数据然后传递给前端页面)
要在django框架中使用模板引擎把视图中的数据更好的展示给客户端,需要完成3个步骤:
在项目配置文件中指定保存模板文件的模板目录。一般模板目录都是设置在项目根目录或者主应用目录下。
在视图中基于django提供的渲染函数绑定模板文件和需要展示的数据变量
在模板目录下创建对应的模板文件,并根据模板引擎内置的模板语法,填写输出视图传递过来的数据
DTL模板文件是一种带有特殊语法的HTML文件,这个HTML文件可以被Django编译,可以传递参数进去,实现数据动态化。在编译完成后,生成一个普通的HTML文件,然后发送给客户端
* 静态文件,数据保存在当前文件,不需要经过任何处理就可以展示出去。普通html文件,图片,视频,音频等这一类文件叫静态文件。
* 动态文件,数据并不在当前文件,而是要经过服务端或其他程序进行编译转换才可以展示出去。 编译转换的过程往往就是使用正则或其他技术把文件内部具有特殊格式的变量转换成真实数据。 动态文件,一般数据会保存在第三方存储设备,如数据库中。django的模板文件,就属于动态文件。
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')], ##配置templates目录的路径,为当前执行文件的父目录下的templates目录
'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',
],
},
},
]
删除settings.py文件关于templates的配置,默认会从当前app的templates目录中查找
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [], ##删除此项, 默认会从当前app的templates目录中查找
'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',
],
},
},
]
编辑全局urls.py文件,添加路径,如下:
urlpatterns = [
path('admin/', admin.site.urls),
path('temp/',views.temp) ####添加路径
]
####################################
views.py文件添加temp函数
def temp(request):
data = "tom" ###添加变量 (单个字符串)
return render(request,"index.html",{"user": data}) ###把变量传入html文件中
###############################
Title
欢迎{{ user }}登录
####使用变量替换{{ user}}值。
编辑全局urls.py文件,添加路径,如下:
urlpatterns = [
path('admin/', admin.site.urls),
path('temp/',views.temp) ####添加路径
]
####################################
views.py文件添加temp函数
def temp(request):
data_list = ["tom","lisa","davia"] ###添加一个列表
return render(request,"index.html",{"user": data_list}) ###把变量传入html文件中
###############################
Title
欢迎{{ user }}登录
####使用变量替换{{ user}}值。
你好,我是{{ user.0}}
###使用列表的第一个值
编辑全局urls.py文件,添加路径,如下:
urlpatterns = [
path('admin/', admin.site.urls),
path('temp/',views.temp) ####添加路径
]
####################################
views.py文件添加temp函数
def temp(request):
data_dict = {"name":"tom","age":18,"height": 180} ###添加一个字典
return render(request,"index.html",{"user": data_dict}) ###把变量传入html文件中
###############################
Title
欢迎{{ user }}登录
####使用变量替换{{ user}}值。
你好,我是{{ user.name}}
###取字典的name 值
编辑全局urls.py文件,添加路径,如下:
urlpatterns = [
path('admin/', admin.site.urls),
path('temp/',views.temp) ####添加路径
]
####################################
views.py文件添加temp函数
def temp(request):
data_list = ["tom","lisa","davia"] ###添加一个列表
return render(request,"index.html",{"user": data_list}) ###把变量传入html文件中
###############################
Title
欢迎{{ user }}登录
####使用变量替换{{ user}}值。
你好,我是{{ user| first}}
###获取列表的第一个值
编辑全局urls.py文件,添加路径,如下:
urlpatterns = [
path('admin/', admin.site.urls),
path('temp/',views.temp) ####添加路径
]
####################################
views.py文件添加temp函数
def temp(request):
data_dict = {"name":"tom","age":18,"height": 180} ###添加一个字典
return render(request,"index.html",{"user": data_dict}) ###把变量传入html文件中
###############################
Title
欢迎{{ user }}登录
####使用变量替换{{ user}}值。
你好,我是{{ user.birth|default="1990-1-1"}}
###取字典的birth 值,没有则为1990-1-1
编辑全局urls.py文件,添加路径,如下:
urlpatterns = [
path('admin/', admin.site.urls),
path('temp/',views.temp) ####添加路径
]
####################################
views.py文件添加temp函数
def temp(request):
data_dict = {"name":"tom","age":18,"height": 180} ###添加一个字典
return render(request,"index.html",{"user": data_dict}) ###把变量传入html文件中
###############################
Title
欢迎{{ user }}登录
####使用变量替换{{ user}}值。
你好,我是{{ user.name|upper}}
###取字典的name的值,替换为大写
编辑全局urls.py文件,添加路径,如下:
urlpatterns = [
path('admin/', admin.site.urls),
path('temp/',views.temp) ####添加路径
]
####################################
views.py文件添加temp函数
def temp(request):
data_dict = {"name":"tom","age":18,"height": 180} ###添加一个字典
return render(request,"index.html",{"user": data_dict}) ###把变量传入html文件中
###############################
Title
欢迎{{ user }}登录
####使用变量替换{{ user}}值。
你好,我是{{ user.name|make_list}}
###取字典的name的值,并转换为列表
编辑全局urls.py文件,添加路径,如下:
urlpatterns = [
path('admin/', admin.site.urls),
path('temp/',views.temp) ####添加路径
]
####################################
views.py文件添加temp函数
def temp(request):
file_size = 100000000
return render(request,"index.html",{"file_size": file_size}) ###把变量传入html文件中
###############################
Title
欢迎{{ user }}登录
####使用变量替换{{ user}}值。
你好,文件大小为{{ file_size|filesizeformat }}
###转换为文件格式大小
编辑全局urls.py文件,添加路径,如下:
urlpatterns = [
path('admin/', admin.site.urls),
path('temp/',views.temp) ####添加路径
]
####################################
views.py文件添加temp函数
def temp(request):
data_list = ["tom", "lisa", "davia"]
return render(request,"index.html",{"user_list": data_list}) ###把变量传入html文件中
###############################
Title
欢迎{{ user_list|random }}登录
####随机从list列表随机选择一个
标签在渲染过程中提供了任意逻辑。标签被 {%
和 %}
包围,如下:
{% csrf_token %}
{% if 或者 for %}
编辑全局urls.py文件,添加路径,如下:
urlpatterns = [
path('admin/', admin.site.urls),
path('temp/',views.temp) ####添加路径
]
####################################
views.py文件添加temp函数
def temp(request):
book_list = [
{"id": 11, "name": "python基础入门", "price": 130.00},
{"id": 17, "name": "Go基础入门", "price": 230.00},
{"id": 23, "name": "PHP基础入门", "price": 330.00},
{"id": 44, "name": "Java基础入门", "price": 730.00},
{"id": 51, "name": "C++基础入门", "price": 300.00},
{"id": 56, "name": "C#基础入门", "price": 100.00},
{"id": 57, "name": "前端基础入门", "price": 380.00},
]
return render(request,"index.html",{"book_list": book_list}) ###把变量传入html文件中
###############################
Title
欢迎登录
{% for item in book_list %}
- {{ item.name }}
{% endfor %}
传统的模板分离技术,依靠{% include “模板文件名”%}实现,这种方式,虽然达到了页面代码复用的效果,但是由此也会带来大量的碎片化模板,导致维护模板的成本上升.因此, Django框架中除了提供这种模板分离技术以外,还并行的提供了 模板继承给开发者.
{% include "模板文件名"%} # 模板嵌入
{% extends "base.html" %} # 模板继承
子模板, templates/index.html
{% extends "base.html" %}
##################################
父模板, templates/base.html
Title
base.html的头部
base.html的内容
base.html的脚部
如果你在模版中使用 {% extends %} 标签,它必须是模版中的第一个标签。其他的任何情况下,模版继承都将无法工作。
在base模版中设置越多的 {% block %} 标签越好。请记住,子模版不必定义全部父模版中的blocks,所以,你可以在大多数blocks中填充合理的默认内容,然后,只定义你需要的那一个。多一点钩子总比少一点好。
为了更好的可读性,你也可以给你的 {% endblock %} 标签一个 名字 。例如:{``% block content``%``}``...``{``% endblock content``%``},在大型模版中,这个方法帮你清楚的看到哪一个 {% block %} 标签被关闭了。
不能在一个模版中定义多个相同名字的 block 标签。
base.html文件的内容
{% block title %}{% endblock %} ###根据不同子界面的类型来添加
{% block head %}{% endblock %}
index.html文件的内容
{% extends "base.html" %}
{% block title %}index的title{% endblock %}
{% block head %}index 的head{% endblock %}