模板
-
模板介绍
-
模板
- 目前市面上有非常多的模板系统,其中最知名最好用的就是DTL和Jinja2。DTL是Django Template Language三个单词的缩写,也就是Django自带的模板语言。当然也可以配置Django支持Jinja2等其他模板引擎,但是作为Django内置的模板语言,和Django可以达到无缝衔接而不会产生一些不兼容的情况。
-
DTL与普通的HTML文件的区别
- DTL模板是一种带有特殊语法的HTML文件,这个HTML文件可以被Django编译,可以传递参数进去,实现数据动态化。在编译完成后,生成一个普通的HTML文件,然后发送给客户端。
-
渲染模板
-
render_to_string
- 找到模板,然后将模板编译后渲染成Python的字符串格式。最后再通过HttpResponse类包装成一个HttpResponse对象返回回去。
from django.template.loader import render_to_string from django.http import HttpResponse def book_detail(request,book_id): html = render_to_string("detail.html") return HttpResponse(html)
- 找到模板,然后将模板编译后渲染成Python的字符串格式。最后再通过HttpResponse类包装成一个HttpResponse对象返回回去。
-
render
- 将模板渲染成字符串和包装成HttpResponse对象一步到位完成。
from django.shortcuts import render def book_list(request): return render(request,\'list.html\')
- 将模板渲染成字符串和包装成HttpResponse对象一步到位完成。
-
render_to_string
-
模板查找路径配置
在项目的settings.py文件中。有一个TEMPLATES配置,这个配置包含了模板引擎的配置,模板查找路径的配置,模板上下文的配置等。模板路径可以在两个地方配置。-
DIRS
- 这是一个列表,在这个列表中可以存放所有的模板路径,以后在视图中使用render或者render_to_string渲染模板的时候,会在这个列表的路径中查找模板。
-
APP_DIRS
- 默认为True,这个设置为True后,会在INSTALLED_APPS的安装了的APP下的templates文件加中查找模板。
-
优先级
- DIRS>APP
- 没有抛出一个TemplateDoesNotExist的异常。
-
DIRS
-
模板
-
模板变量
-
变量
-
模板中可以包含变量,
- Django在渲染模板的时候,可以传递变量对应的值过去进行替换。
-
变量的命名规范和Python非常类似
- 只能是阿拉伯数字和英文字符以及下划线的组合,不能出现标点符号等特殊字符。
-
变量需要通过视图函数渲染,视图函数在使用render或者render_to_string的时候可以传递一个context的参数
- 这个参数是一个字典类型。以后在模板中的变量就从这个字典中读取值的
profile.html模板代码<p>{{ username }}</p># views.py代码def profile(request): return render(request,\'profile.html\',context={\'username\':\'huangyong\'})
- 这个参数是一个字典类型。以后在模板中的变量就从这个字典中读取值的
-
模板中的变量同样也支持点(.)的形式。
不能通过中括号的形式访问字典和列表中的值,比如dict[\'key\']和list[1]是不支持的!-
字典
- 查找这个字典的username这个key对应的值。
-
对象
- 查找这个对象的username属性,或者是username这个方法。
-
.1
- 一个列表或者元组或者任意的可以通过下标访问的对象,如果是的话就取这个列表的第1个值。
- 如果不是就获取到的是一个空的字符串。
-
字典
-
模板中可以包含变量,
-
变量
-
模板标签
-
if
- if相当于python中的if语句
-
使用方法
- {%if%}
- {%else%}
- {%endif%}
-
判断运算符
- ==、!=、<、<=、>、>=、in、not in、is、is not等
-
for
- 相当于python中的for循环
-
使用方法
- {%for %}
- {%endfor%}
-
快捷键
- for Tab
- 如果要反向遍历在最后加reverrsed
-
DTL变量
-
forloop.counter
- 当前循环的下标。以1作为起始值。
-
forloop.counter0
- 当前循环的下标。以0作为起始值。
-
forloop.revcounter
- 当前循环的反向下标值,以1作为最后一个元素的下标。
-
forloop.revcounter0
- 当前循环的反向下标值,以0作为最后一个元素的下标。
-
forloop.first
- 是否是第一次遍历。
-
forloop.last
- 是否是最后一次遍历
-
forloop.counter
-
empty
-
在没有值得情况下
- 返回empty后的提示语
-
在没有值得情况下
-
with
- 模板中定义变量
-
使用方法
- {% with lisi=persons.1 %} 或 {% with persons.1 as lisi %}
- {% endwith %}
-
url
- 模板中url写法
-
使用方法
- {% url \'name\'%}
-
传参
- {% url \'name\' xxx=1%}
-
if
-
过滤器
-
在模板中对数据进行处理使用
- {{ value|filter_name:\'str\'}}
- 不能有空格
-
常用过滤器
-
add
- 将值和参数转换成整形然后进行相加。
-
cut
- 移除值中所有指定的字符串。
-
date
- 将一个日期按照指定的格式,格式化成字符串。
-
时间格式化格式
-
Y
- 四位数字的年份
-
m
- 两位数字的月份
-
n
- 月份,1-9前面没有0前缀
-
d
- 两位数字的天
-
j
- 天,但是1-9前面没有0前缀
-
g
- 小时,12小时格式的,1-9前面没有0前缀
-
h
- 小时,12小时格式的,1-9前面有0前缀
-
G
- 小时,24小时格式的,1-9前面没有0前缀
-
H
- 小时,24小时格式的,1-9前面有0前缀
-
i
- 分钟,1-9前面有0前缀
-
s
- 秒,1-9前面有0前缀
-
Y
-
default
-
如果值被评估为False。
- 使用default过滤器提供的默认值。
-
如果值被评估为False。
-
default_if_none
-
如果值是None
- 使用default_if_none提供的默认值。
- 只有这个值是等于None的时候才会使用默认值。
-
如果值是None
-
first
- 返回列表/元组/字符串中的第一个元素。
-
last
- 返回列表/元组/字符串中的最后一个元素。
-
floatformat
-
使用四舍五入的方式格式化一个浮点类型。
-
如果没有传递参数
- 在小数点后保留一个小数
-
如果传递参数
- 就保留几位
-
如果没有传递参数
-
使用四舍五入的方式格式化一个浮点类型。
-
join
- 将列表/元组/字符串用指定的字符进行拼接
-
length
- 获取一个列表/元组/字符串/字典的长度
-
lower
- 将值中所有的字符全部转换成小写
-
upper
- 将值中所有的字符全部转换成大写
-
random
- 在被给的列表/字符串/元组中随机的选择一个值
-
safe
- 标记一个字符串是安全的。也即会关掉这个字符串的自动转义
-
slice
- 切片操作
-
striptags
- 删除字符串中所有的html标签
-
truncatechars
- 对字符串进行切割,并且会拼接三个点来作为省略号
-
add
-
在模板中对数据进行处理使用
-
自定义过滤器
-
步骤
-
在项目目录下创一个文件夹
- templatetags 固定的名称
-
在templatetags目录下建一个py文件用于写代码
-
导入模块
- from django.template import Library-
- 定义过滤器函数
- 将过滤器函数注册进去django项目
-
导入模块
-
导入过滤器的py文件
- {%load filters_name%}
- 使用方法与过滤器使用方法一致
-
在项目目录下创一个文件夹
-
步骤
-
模板结构优化
-
引入模板
- 有些代码在许多模板中都用的到,我们把这些代码抽取出来,进行引入,避免重复。
-
include
- {% include \'模板名\' %}
- 默认include标签包含模版,会自动的使用主模版中的上下文,也即可以自动的使用主模版中的变量。如果想传入一些其他的参数,那么可以使用with语句。
-
模板继承
-
模版继承类似于Python中的类,在父类中可以先定义好一些变量和方法,然后在子类中实现。
- 模版继承也可以在父模版中先定义好一些子模版需要用到的代码,然后子模版直接继承就可以了。并且因为子模版肯定有自己的不同代码,因此可以在父模版中定义一个block接口,然后子模版再去实现。
-
{% extends "模板名" %}
- extends标签必须放在模版的第一行。
-
block接口
- 子模版中的代码必须放在block中
-
{{block.super}}
- 在某个block中需要使用父模版的内容,那么可以使用{{block.super}}来继承。
- {% block xxx %} {% endblock xxx %}
-
模版继承类似于Python中的类,在父类中可以先定义好一些变量和方法,然后在子类中实现。
-
引入模板
-
加载静态文件
-
css样式文件,js执行文件和图片在DTL中加载。
- 使用static标签
-
加载静态文件步骤
- 首先确保django.contrib.staticfiles已经添加到settings.INSTALLED_APPS中。
- 确保在settings.py中设置了STATIC_URL。
- 在已经安装了的app下创建一个文件夹叫做static。
-
如果有一些静态文件是不和任何app挂钩的。那么可以在settings.py中添加STATICFILES_DIRS。
- STATICFILES_DIRS = [ os.path.join(BASE_DIR,"static") ]
-
在模版中使用load标签加载static标签。
- {% load static %}
- {% static \'文件路径\' %}
-
不在模板中使用load标签调用,在settings中添加builtins"
- 在settings.py中的TEMPLATES/OPTIONS
- 添加\'builtins\':[\'django.templatetags.static\']
-
手动将静态文件的url与静态文件的路径进行映射
-
from django.conf import settings
- from . import settings
- from django.conf.urls.static import static
- urlpatterns = [ # 其他的url映射 ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
-
from django.conf import settings
-
css样式文件,js执行文件和图片在DTL中加载。