模板的渲染:视图函数在返回Response的时候,返回的是一个HTML文件,并且会传递一些数据给HTML,最终将这些数据展示页面中。
Django中提供了一个templates文件夹,用于存放所有的html文件。
templates文件夹的创建位置:
- 在项目根目录下创建:这种情况整个项目只有一个templates文件夹,供所有的APP使用;
- 分模块,在各自的app下创建templates文件夹。
例:
def index(request):
# render: 渲染
# 模板:html文件
# template_name:指定要渲染的模版的名称。(根据实际情况而定)
return render(request, template_name='temrender/index.html')
如果是将templates文件夹放在了每一个app下,要注意模板可能会引用错,引用到其他app下的模板文件。
模板的查找书序:
- 是先从根目录下的templates文件中查找,如果根目录下没有templates文件夹、获取说根目录下没有找到需要的模板。
- 此时Django回去app下的templates中着模板,如果自己app下的templates中没有这个模板,再去其他app下的templates中查找。
- 如果最终所有的templates文件中都没有找到所需要的模板,就会抛出异常,说模板问不存在 TemplateDontExisted
解决办法:在各自app下的templates文件夹中,在创建一个文件夹,用于区分文件夹名相同的html模板文件。
那么在渲染模板的时候,如何向模板传递数据呢?
给出如下代码案例:
from django.shortcuts import render
class People(object):
def __init__(self, name, age):
self.name = name
self.age = age
def get_name(self):
return '我的名字是:{}'.format(self.name)
import datetime
def html_data(request):
"""
如何在渲染模版的时候,向模版传递数据。
能够传递的数据:
字符串
列表
字典
对象
数字类型
:param request:
:return:
"""
p = People('李四', 25)
# context: 上下文,负责向模版传递数据。
# temrender/index.html: temrender不是代表APP的名称,是templates文件夹下的一个文件夹的名称,这个名称可以随便定义。只是当前是和APP的名称重复了。
return render(request, template_name='temrender/index.html', context={
'name': '张三',
'books': ['HTML', 'JS', 'CSS', 'PYTHON', 100, 200, True],
'date': datetime.datetime.now(),
'people': p,
'dict': {'username': 'haha', 'password': '123'}
})
接下来就是对templates文件的设置了
在创建的templates文件夹中创建一个.html文件,读取views.py文件中的数据
代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Django模版渲染</title>
</head>
<body>
<h1>temrender这个APP下的模版</h1>
{# {{ }}: 作用就是用于加载一个变量的值。name就是变量名称。 #}
<h1>{{ name }}</h1>
{# 如果是列表数据,可以通过索引取一个值,也可以通过for循环遍历。jinja2 #}
<h1>{{ books.0 }}-{{ books.1 }}-{{ books.2 }}-{{ books.3 }}-{{ books.4 }}</h1>
{# {% %}: 作用就是用来写for循环、if判断等条件语句的语法。 #}
{% for book in books %}
<p>{{ book }}</p>
{% endfor %}
{% if people.age < 18 %}
<p>未成年人</p>
{% elif people.age < 30 %}
<p>中年人</p>
{% else %}
<p>老年人</p>
{% endif %}
{% if name %}
<p>name变量是存在的</p>
{% else %}
<p>name变量不存在</p>
{% endif %}
<p>{{ dict.username }}-{{ dict.password }}</p>
{% for key, value in dict.items %}
<p>{{ key }}: {{ value }}</p>
{% endfor %}
{# 列表的其它两种遍历方式: #}
{% for book in books %}
{# forloop.counter: 获取循环的计数 #}
{# counter: 计数从1开始; 12345 #}
{# counter0: 计数从0开始; 01234 #}
{# revcounter: 倒序从7开始计数; 7654321 #}
{# revcounter0:倒序从6开始计数; 6543210 #}
<p>{{ forloop.counter }}: {{ book }}</p>
<p>{{ forloop.counter0 }}: {{ book }}</p>
<p>{{ forloop.revcounter }}: {{ book }}</p>
<p>{{ forloop.revcounter0 }}: {{ book }}</p>
{% endfor %}
</body>
</html>
别忘了在urls.py文件中设置
运行结果如下: