定义
DTL(django Tempalte language)是Django自带的模板语言。 Django支持Jinja2等其他模板引擎。DTL模板是一种带有特殊语法的HTML文件,可以被Django编译,产地参数,实现数据动态化。在编译完成后,生成一个普通的HTML文件,然后发送给客户端。
在 Django 中提供了 render ,直接将模板渲染成字符串和包装成HttpResponse对象。views 下的示例如下:
<span>def</span><span> index(request): </span><span>return</span> render(request,<span>"</span><span>index.<a href="https://www.gaodaima.com/tag/html" title="查看更多关于html的文章" target="_blank">html</a></span><span>"</span>)
www#gaodaima.com来源gaodai$ma#com搞$代*码*网搞代码
模板查找顺序
新添加的 app 需要在 settings 进行注册:
INSTALLED_APPS =<span> [ </span><span>"</span><span>django.contrib.admin</span><span>"</span><span>, </span><span>"</span><span>django.contrib.auth</span><span>"</span><span>, </span><span>"</span><span>django.contrib.contenttypes</span><span>"</span><span>, </span><span>"</span><span>django.contrib.sessions</span><span>"</span><span>, </span><span>"</span><span>django.contrib.messages</span><span>"</span><span>, </span><span>"</span><span>django.contrib.staticfiles</span><span>"</span><span>, </span><span>"</span><span>book</span><span>"</span><span>, ]</span>
模板文件查找:
首先会在项目的 templates 下查找。
其次在自己所在的 app下的 templates 中查找。
最后在其他的 app下 查找。
如果下面的代码中的 APP_DIRS 的值为 False,则不会在 app下进行查找,只会在项目的 templates 下查找。
TEMPLATES =<span> [ { </span><span>"</span><span>BACKEND</span><span>"</span>: <span>"</span><span>django.template.backends.django.DjangoTemplates</span><span>"</span><span>, </span><span>"</span><span>DIRS</span><span>"</span><span>: [], </span><span>"</span><span>APP_DIRS</span><span>"</span><span>: True, </span><span>"</span><span>OPTIONS</span><span>"</span><span>: { </span><span>"</span><span>context_processors</span><span>"</span><span>: [ </span><span>"</span><span>django.template.context_processors.debug</span><span>"</span><span>, </span><span>"</span><span>django.template.context_processors.request</span><span>"</span><span>, </span><span>"</span><span>django.contrib.auth.context_processors.auth</span><span>"</span><span>, </span><span>"</span><span>django.contrib.messages.context_processors.messages</span><span>"</span><span>, ], }, }, ]</span>
参数传递
在 render 中有context 参数作为参数的传递。
例如 views 为:
<span>def</span><span> index(request): context </span>=<span> { </span><span>"</span><span>username</span><span>"</span>: <span>"</span><span>ty</span><span>"</span><span> } </span><span>return</span> render(request,<span>"</span><span>index.html</span><span>"</span>, context=context)
在html中使用两个大括号{{ “变量” }} 进行引用:
<body><span> {{ username }} </span></body>
如果是有层级关系,例如类中的变量,则可以使用点 class.value 进行获取。
例如字典,也可以使用点进行获取 dict.key 。但是如果使用 dict.keys 获取到的是字典的所有 key。不能通过中括号[]的形式进行获取。
例如列表,可以使用下标进行获取 list.index 。元组也是一样的。
常用标签
if 标签:也可以结合 else 一起使用,但是需要有结束表示 endif,可以使用基本运算符 == ,!=, >= 等。
{% <span>if</span> number < 1 %<span>} </span><p>小于1</p><span> {</span>% <span>if</span> number == 1 %<span>} </span><p>等于1</p><span> {</span>% <span>else</span> %<span>} </span><p>大于1</p><span> {</span>% endif %}
for 标签:与 Python 的 for 语句的情形类似,循环语法是 for X in Y ,Y 是要迭代的序列而 X 是在每一个特定的循环中使用的变量名称。每一次循环中,模板系统会渲染在 {% for %} 和 {% endfor %} 之间的所有内容。
<ul><span> {</span>% <span>for</span> athlete <span>in</span> athlete_list %<span>} </span><li>{{ athlete.name }}</li><span> {</span>% endfor %<span>} </span></ul>
url标签
url 后面的为 path 中的 name 值。
<a href=<span>"</span><span>{ % url "urlname" % }</span><span>"</span>></a>
也可以在 url 中添加参数:
<a href=<span>"</span><span>{ % url "urlname" id="3" % }</span><span>"</span>></a>
过滤器
在DTL中不支持函数的调用形式,因此不能给函数传递参数。而过滤器其实就是一个函数,可以对需要处理的参数进行处理,并且可以额外接收一个参数。
add: 将传进来的参数添加到原来的值上面。
{{ value|add:<span>"</span><span>3</span><span>"</span> }}
cut: 移除字符串,类似于 replace 函数。
{{ value|cut:<span>"</span> <span>"</span> }}
date:日期格式,将一个日期按照制定格式,格式化成字符串。
<span>#</span><span> 数据</span> context =<span> { ”birthday“:datetiem.now() } </span><span>#</span><span> 模板</span> {{ birthday|date:<span>"</span><span>Y/m/d</span><span>"</span> }}
其他时间格式化的方式。
格式字符 |
描述 |
示例 |
Y |
四位数字的年份 |
2018 |
m |
两位数字的月份 |
01-12 |
n |
月份,1-9前面没有0前缀 |
1-12 |
d |
两位数字的天 |
01-31 |
j |
天,但是1-9前面没有0前缀 |
1-31 |
g |
小时,12小时格式的,1-9前面没有0前缀 |
1-12 |
h |
小时,12小时格式的,1-9前面有0前缀 |
01-12 |
G |
小时,24小时格式的,1-9前面没有0前缀 |
1-23 |
H |
小时,24小时格式的,1-9前面有0前缀 |
01-23 |
i |
分钟,1-9前面有0前缀 |
00-59 |
s |
秒,1-9前面有0前缀 |
00-59 |
其他过滤器
过滤器 | 说明 |
---|---|
addslashes | 添加斜杠 |
capfirst | 首字母大写 |
center | 文本居中 |
default | 设置默认值 |
default_if_none | 为None设置默认值 |
dictsort | 字典排序 |
dictsortreversed | 字典反向排序 |
divisibleby | 整除判断 |
escape | 转义 |
escapejs | 转义js代码 |
filesizeformat | 文件尺寸人性化显示 |
first | 第一个元素 |
floatformat | 浮点数格式化 |
force_escape | 强制立刻转义 |
get_digit | 获取数字 |
iriencode | 转换IRI |
join | 字符列表链接 |
last | 最后一个 |
length | 长度 |
length_is | 长度等于 |
linebreaks | 行转换 |
linebreaksbr | 行转换 |
linenumbers | 行号 |
ljust | 左对齐 |
lower | 小写 |
make_list | 分割成字符列表 |
phone2numeric | 电话号码 |
pluralize | 复数形式 |
pprint | 调试 |
random | 随机获取 |
rjust | 右对齐 |
safe | 安全确认 |
safeseq | 列表安全确认 |
slice | 切片 |
slugify | 转换成ASCII |
stringformat | 字符串格式化 |
striptags | 去除HTML中的标签 |
time | 时间格式化 |
timesince | 从何时开始 |
timeuntil | 到何时多久 |
title | 所有单词首字母大写 |
truncatechars | 截断字符 |
truncatechars_html | 截断字符 |
truncatewords | 截断单词 |
truncatewords_html | 截断单词 |
unordered_list | 无序列表 |
upper | 大写 |
urlencode | 转义url |
urlize | url转成可点击的链接 |
urlizetrunc | urlize的截断方式 |
wordcount | 单词计数 |
wordwrap | 单词包裹 |
yesno | 将True,False和None,映射成字符串‘yes’,‘no’,‘maybe’ |
模板继承
编写一个公共 html 文件,在子模板中继承公共模块即可达到复用的目的。在子模块中使用 { % extends “xxx.html” % }
在公共 html 文件中,可以使用 block 作为一个接口,进行对公共模块区域的内容进行填充。填充后会覆盖公共模块 block 中内容。
<span>#</span><span> 公共模块,block后面为block名称</span> {% block blockname %<span>} {</span>% endblock %<span>} </span><span>#</span><span> 子模块</span> <span> { </span>% extends <span>"</span><span>xxx.html</span><span>"</span> %<span> } {</span>% block blockname %<span>} {</span>% endblock %}
如果公共模块中 block 中有部分内容不希望被覆盖,则可添加 block.super 进行标识。
<span>#</span><span> 公共模块,block后面为block名称</span> {% block blockname %<span>} {{ block.super }} 这是不会被覆盖的代码 {</span>% endblock %}
加载静态文件
1、确保 django.contrib.staticfiles 已经添加到settings中的INSTALLED_APPS
2、确保settings中设置了 STATIC_URL = “/static/”
3、在已经安装了的 app 下创建一个文件夹叫 static
4、如果一些静态文件是不和任何app挂钩的,可以在 settings 中添加 STATICFILES_DIRS
STATICFILES_DIRS =<span> [ os.path.join(BASE_DIR, </span><span>"</span><span>static</span><span>"</span><span>) ]</span>
5、在模板中使用 load 标签加载 static 标签。
{% load static %<span>} </span><link rel=<span>"</span><span>stylesheet</span><span>"</span> href=<span>"</span><span>{ % static "style.css" % }</span><span>"</span>>
6、如果不想每次在模板中加载静态文件使用 load 加载 static 标签,那么可以在 settings 中的 TEMPLATES/OPTIONS 中添加内置标签,builtins
<span>"</span><span>builtins</span><span>"</span>:[<span>"</span><span>django.templatetags.static</span><span>"</span>]
7、如果没有在 settings 下的 INSTALLED_APPS 中添加 django.contrib.staticfiles ,那么需要手动将请求静态文件的 url 与静态文件的路径进行映射。