**模板基本由两个部分组成,一是HTML代码,二是python逻辑控制代码。
**
M:Model,模型, 和MVC中M功能相同,和数据库进行交互。
V:View,视图, 和MVC中C功能相同,接收请求,进行处理,与M和T进行交互,返回应答。
T:Template,模板, 和MVC中V功能相同,产生html页面。
DTL模板语法
模板中可以包含变量,Django在渲染模板的时候,可以传递变量对应的值过去进行替换。变量的命名规范和Python非常类似,只能是阿拉伯数字和英文字符以及下划线的组合,不能出现标点符号等特殊字符。变量需要通过视图函数渲染,视图函数在使用render或者render_to_string的时候可以传递一个context的参数,这个参数是一个字典类型。
模板渲染
模板渲染常用的两种方式:
1、render_to_string
2、render
方法运用代码示例:
1.render_to_string:找到模板,然后将模板编译后渲染成Python的字符串格式。
最后再通过HttpResponse类包装成一个HttpResponse对象返回回去。
from django.http import HttpResponse
from django.template.loader import render_to_string
def book_html(request):
html = render_to_string("index.html")
return HttpResponse(html)
2、render直接将模板渲染成字符串进行包装
from django.shortcuts import render
def book_html(request):
return render(request, "index.html")
模板查找路径配置
在项目的settings.py文件中。有一个TEMPLATES配置,这个配置包含了模板引擎的配置,模板查找路径的配置,模板上下文的配置等。模板路径可以在两个地方配置。
1.DIRS:这是一个列表,在这个列表中可以存放所有的模板路径,以后在视图中使用render或者render_to_string渲染模板的时候,会在这个列表的路径中查找模板。
2.APP_DIRS:默认为True,这个设置为True后,会在INSTALLED_APPS的安装了的APP下的templates文件加中查找模板。settings.py中INSTALLED_APPS数组中添加你的app名字。
3.查找顺序:比如代码render(‘list.html’)。先会在DIRS这个列表中依次查找路径下有没有这个模板,如果有,就返回。如果DIRS列表中所有的路径都没有找到,那么会先检查当前这个视图所处的app是否已经安装,如果已经安装了,那么就先在当前这个app下的templates文件夹中查找模板,如果没有找到,那么会在其他已经安装了的app中查找。如果所有路径下都没有找到,那么会抛出一个TemplateDoesNotExist的异常。
模板变量
- 变量的使用
{{ username }} #使用双大括号来引用变量 - tag的使用
{% if %}
{% endif %} #使用大括号和百分号的组成来表示使用Django提供的
template tag (注意:tag标签要有与之相对应的结束标签)
{% for item in item_list %}
{% endfor %}
代码示例:
# pycharm中的代码
def book_second(request):
content = {
'lis':{
"a",
"b",
"c"
},
'lis_2': {
"a":12,
"b":13,
"c":14
},
'lis3':[1,2,3]
}
return render(request, "index.html", context=content)
# html中的代码
<!--条件需用空格隔开-->
{% if "a" in lis%}
<p>a exist</p>
{% else %}
<p>a not exist</p>
{% endif %}
<hr>
{% for keys, values in lis_2.items %}
<p>{{keys}}:{{values}}</p>
{% endfor %}
<hr>
<!--反转列表-->
{% for i in lis3 reversed %}
<p>{{i}}</p>
{% endfor %}
for tag还提供了一些内置参数来提供模板循环的信息。
- forloop.counter 当前循环计数,从1开始
{% for item in list %}{{ forloop.counter }}: {{ item }}
{% endfor %} - forloop.counter0 当前循环计数,从0开始,标准索引方式
- forloop.revcounter 当前循环的倒数计数,从列表长度开始
- forloop.revcounter0 当前循环的倒数计数,从列表长度减1开始
- forloop.first bool值,判断是不是循环的第一个元素
- forloop.last 判断是不是循环的最后一个元素
- forloop.parentloop 用在嵌套循环中,得到parent循环的引用,然后可 以使用以上的参数