模板的渲染:视图函数在返回response的时候,返回的是一个html文件,并且会传递一些数据给html,最终将这些数据展示在页面上。
Django中提供了一个templates文件夹,用于存放所有的html文件。
templates文件夹的创建位置:
1、在项目根目录下创建:这种情况下整个项目只有一个templates文件夹,供所有的app使用;
2、分模块,在各自的app下创建templates文件夹。
以下先进行第一种的情况。
1、创建项目和app。
2、设置项目根目录为source root
3、在项目根目录下创建一个名为templates的文件夹。
并在templates文件夹下新建一个index.html文件。
4、此时我们在入口的urls.py文件(即djangotemplates下的urls.py)写入如下代码:
from django.contrib import admin
from django.urls import path
from temrender import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/',views.index)
]
5、编写业务逻辑,即views.py文件。
def index(request):
#render:渲染
#模板:html文件
#template_name:指定要渲染的模板名称。
return render(request,template_name='index.html')
6、在settings.py文件配置templates文件路径。
6、运行查看,浏览器输入网址127.0.0.1:8000/index
第二种
如果是将templates文件夹放在了每一个app下,要注意模板可能会引用错,引用到其他app下的模板文件。
模板的查找顺序是先从根目录下的templates文件中查找,如果根目录下templates这个文件夹/或者说没有找到需要的模板,此时Django会去自己的app下的templates中找模板。如果自己app下的templates中没有这个模板,再去其他app下的templates中查找。如果最终所有的templates中都没有找到所需的模板,就会抛出异常,说模板文件不存在 TempalateDontExisted
1、在创建一个app
命令python manage.py startapp render
2、在render这个app和temrender这个app下分别新建一个templates文件夹,并分别在文件夹下新建一个index.html文件。
3、此时我们在每个app及根目录下的templates文件夹下的index.html文件稍作修改。
4、此时我们先运行一下看到的是如下图所示:
5、现在我们将根目录下的templates文件夹下的index.html改为index1.html.
6、再次运行,发现已经变成了render这个app的index.html了。
且模板的查找顺序是按照注册app的顺序查找的。
同理,将render这个app下得templates文件夹下的index.html文件夹改为index1.html后,浏览器运行就会显示的是temrender这个app的index.html模板。原因是在根目录下没有查找到templates文件夹下的index.html,此时按照注册app顺序,先去render这个app中查找,没有找到templates文件夹下的index.html。此时就会去找temrender这个app下的templates文件夹下的index.html文件。这里不做尝试,望读者自行尝试。
7、解决办法
在各自app下的templates文件中,在新建一个文件夹,用于区分文件名相同的html模板文件。
此时我们以temrender这个app做示范。在其templates文件夹下再新建一个temrender文件夹。把index.html挪进这一级的文件夹下。
修改视图函数中template_name。
此时运行,返回的就是指定的的app模板index.html。
第三部分
如何在渲染模板的时候,向模板传递数据。
注:能够传递的数据:字符串、列表、字典、对象、数字类型(整数、小数等)。
1、我们在views.py文件中编写代码。
class People(object):
def __init__(self,name,age):
self.name=name
self.age=age
def get_name(self):
return '我的名字是:{}'.format(self.name)
def html_data(request):
'''
如何在渲染模板的时候,向模板传递数据。
能够传递的数据:字符串、列表、字典、对象、数字类型(整数、小数等)
:param request:
:return:
'''
p1=People('李四',25)
#context:上下文,负责向模板传递数据
return render(request, template_name='temrender/index.html',context={
'name':'张三',
'books':['Html','js','cs',100,20.1,True],
'date':datetime.datetime.now(),
'object':p1
})
在入口文件urls.py中国编写路由。
浏览器运行查看。
2、现在我们接着取传递的其他参数。
{# {{ }}:作用就是用于加载一个变量的值,name就是变量名 #}
{# 如果是列表数据,可以通过索引取一个值,也可以通过for循环遍历 #}
由于books是一个列表数据,所以我们可以通过索引取值,或是for循环取值。
①索引取值
编写代码:
网页刷新查看
②for循环取值
编写代码
运行查看
3、接着取对象的属性。
这里为了方便查看,将之前定义的object改为了people,即
取出people属性的,同时做if条件判断。编写代码
刷新查看:
4、取字典的值
①根据键取值
刷新查看
②for循环取值
刷新查看
总结:
{# #}:注释语法
{{ name }}:作用就是用于加载一个变量的值,name就是变量名
如果是列表数据,可以通过索引取一个值,也可以通过for循环遍历
{% %}:作用就是用来写for循环,if判断等条件语句的语法
{% for foo in object %}
代码1
{% endfor %}:for循环语句
{% if people.age < 18 %}
代码1
{% elif people.age < 30 %}
代码2
{% else %}
代码3
{% endif %} :if条件判断
补充:此处再补充列表的其他几种遍历方式。
{% for book in books %}
{# forloop.counter:获取循环的计数,即列表的长度,我之前定义的列表长度是6 #}
{# counter:计数从1开始,123456#}
{# counter0:计数从0开始,012345 #}
{# revcounter:倒序从6开始计数,654321#}
{# revcounter0:倒序从5开始计数,543210 #}
<p>{{ forloop.counter }}:{{ book }}</p>
<p>{{ forloop.counter0 }}:{{ book }}</p>
<p>{{ forloop.revcounter }}:{{ book }}</p>
<p>{{ forloop.revcounter0 }}:{{ book }}</p>
{% endfor %}
刷新显示
至此,模板的渲染到此结束。
第三部分
模板过滤器的使用:
①模板语言中的过滤器的作用主要就是对{{ 变量 }}的值进行处理,比如设置时间格式,大小写转换等。
②多个过滤器用|隔开即可
代码实现
刷新显示
这里诸多过滤器不一一介绍,需要的使用的可以参考2.1官方文档
至此,模板的查找顺序与渲染及过滤器的使用到此结束。