模板
- 模板介绍
- 模板
- 目前市面上有非常多的模板系统,其中最知名最好用的就是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中加载。