Django框架之四-->模板
Django模板系统
记在前面
模板中可以使用request对象调用他的属性和方法
常用语法
只需要记两种特殊符号:
{{ }}和 {% %}
变量相关的用{{}},逻辑相关的用{%%}。
变量--万能的.
{{ 变量名 }}
变量名由字母数字和下划线组成。
点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值。
你能使用.来从一个列表中取值,从一个字典中取值,获取一个对象的属性,更甚至来调用一个没有参数的方法
在列表中使用{{ 变量名.索引 }} 的方式取值
在字典中使用{{ 变量名.键 }} 的方式取值
在对象中使用{{ 变量名.属性名或方法名}} 的方式取值或得到返回值
Filters--过滤(有点像filter函数)
语法: {{ value|filter_name:参数 }}
'|'左右没有空格没有空格没有空格 # default {{ value:default: "nothing"}} # 如果value值没传的话就显示nothing length {{ value|length }} # 返回value的长度,如 value=['a', 'b', 'c', 'd']的话,就显示4. # filesizeformat # 将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如: {{ value|filesizeformat }} # 如果 value 是 123456789,输出将会是 117.7 MB。 # slice # 切片 {{value|slice:"2:-1"}} # date # 格式化 {{ value|date:"Y-m-d H:i:s"}} # safe # Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。
但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中
是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义
的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独
的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。 比如: value = "<a href='#'>点我</a>" {{ value|safe}}
# truncatechars
如果字符串字符多余指定的字符数量,那么会被截断,截断的字符串将以...结尾
参数:截断的字符数
{{ value|truncatechars:9}}
还有一个按单词分的(单词之间是空格),
{{ value|turncatewords }}
另一个将html文本渲染出样式的方法
from django.utils.safestring import mark_safe
自定义filters
文件所在位置
文件所在的文件夹名为templatetags
且文件夹需要与urls.py等文件同级(APP文件中)
任意创建一个py文件
创建名字交 register 的Library类的对象
定义函数
第一种方式
from django import template register = template.Library() # 必须有上面两句 # name就是管道符后面的filter名 @register.filter(name="cut") def cut(value, arg): # value是管道符前value,arg是filter参数 return value.replace(arg, "") # return值为模板中实际值 # 可以不指定name,使用函数名 @register.filterarg def add_sb(value): return value+SB
使用
{{ somevariable|cut:"0" }} # 将"0"替换为空字符串 {{ d.name|addSB }} # 在后面添加一个SB(帅逼)
第二种方式
@register.simple_tag def func(a1,a2,a3,a4): result = a1+a2+a3+a4 return result
使用
{% func 1 2 3 4 %}
两种方式的区别
register.filterarg # 有且只可以有两个参数,第一个参数是|前的值,第二个参数要在函数名后:参数 {{ arg1|func:arg2}} # 且调用时使用两个{{}},并且可以作为if判断的条件() # 可以处理arg2,使它变成多个值 register.simple_tag # 可以传递多个参数,按顺序传入 {% func 1 2 3 4 %} # 使用{% %} 的方式调用
第三种方式
from django import template register = template.Library() # register的名字是固定的,不可改变 @register.inclusion_tag("blog/archive.html") # 传递一个HTML页面 def get_archive_style(username): ... return {kwargs}
使用方法
{% load py文件名 %} {% get_archive_style username %} # 在一个模板中放入get_archive_style 并且给一个参数就是把函数的执行结果传递给装饰器中的模板,并且把 模板插入到这里
语法
for
<ul> {% for user in user_list %} <li>{{ user.name }}</li> {% endfor %} </ul>
for循环可用的一些参数:
Variable | Description |
---|---|
forloop.counter |
当前循环的索引值(从1开始) |
forloop.counter0 |
当前循环的索引值(从0开始) |
forloop.revcounter |
当前循环的倒序索引值(从1开始) |
forloop.revcounter0 |
当前循环的倒序索引值(从0开始) |
forloop.first |
当前循环是不是第一次循环(布尔值) |
forloop.last |
当前循环是不是最后一次循环(布尔值) |
forloop.parentloop |
本层循环的外层循环 |
for ... empty
for循环中没有值时走empty中的内容,让你知道这个是生效的,只是没有值
<ul> {% for user in user_list %} <li>{{ user.name }}</li> {% empty %} <li>空空如也</li> {% endfor %} </ul>
if,elif和
else
{% if user_list %} 用户人数:{{ user_list|length }} {% elif black_list %} 黑名单数:{{ black_list|length }} {% else %} 没有用户 {% endif %}
当然也可以只有if和else
{% if user_list|length > 5 %} 七座豪华SUV {% else %} 黄包车 {% endif %}
if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。
with
定义一个中间变量
{% with total=business.employees.count %} {{ total }} employee{{ total|pluralize }} {% endwith %}
csrf_token
这个标签用于跨站请求伪造保护。
在页面的form表单里面写上{% csrf_token %}
会产生一个隐藏的input标签,用来校验
协商这一项后就不用注释配置文件中的csrf那一项了
注释
{#内容#}
母板
将一些相同的内容作为一个母板,向模板中填充内容来生成不同的页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Title</title> {% block page-css %} <!-- 这就是待填充的块 page-css 是这个块的名字,这是准备填充css的块--> {% endblock %} </head> <body> <h1>这是母板的标题</h1> {% block page-main %} <!--一个准备填充HTML的块--> {% endblock %} <h1>母板底部内容</h1> {% block page-js %} <!--一个准备填充js的块--> {% endblock %} </body> </html>
子页面在页面的最上方使用下面的语法来继承母板
{% extends "母板文件名" %}
通过在母板中使用{% block xxx %}
来定义"块"。
在子页面中通过定义母板中的block名来对应替换母板中相应的内容。
{% block page-main %} <p>赵客缦胡缨,吴钩霜雪明。</p> <p>银鞍照白马,飒沓如流星。</p> {% endblock %}
组件
可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方按如下语法导入即可。
{% include "文件名" %}
静态文件相关
动态的写static,修改配置文件中的STATIC_URL这一项时,不必再去修改文件中的内容
一个图片
{% load static %} <img src="{% static 'images/hi.jpg' %}" alt="Hi!" />
引用js文件
{% load static %} <script src="{% static 'mytest.js' %}"></script>
某个文件多出被用到可存到一个变量
{% load static %} {% static "images/hi.jpg" as myphoto %} <img src="{{ myphoto }}">
同时存在的还有load staticfiles,二者区别参考这里
使用get_static_prefix
也能完成上面的作用,还不带引号不带引号不带引号
图片
{% load static %} <img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />
css
{% load static %} <script src="{% get_static_prefix %}mytest.js "></script>
存变量
{% load static %} {% get_static_prefix as pre %} <img src="{{ pre }}images/111.png" alt="">