4 模板层
一、模板语法の重点
1 变量:{{ 变量名 }}
深度查询时用句点符
过滤器
2 标签:{{% %}}
二、模板语法の变量
{{ VariableName }} {{ VariableName.属性 }} 可用 . 符号进行进一步的深度查询,既可以对列表进行更进一步的查询取值,也可以对字典进行取值。 {{ VariableName.func }} 在执行对象方法时,不用加()即可执行,这是在 Django 对语法的规定。 {# #} 正常情况下,在 HTML 页面中的注释,是可以查看到的。但是模板中的注释在前端页面是看不到的。(通过进入开发者模式查看) 空列表渲染后的结果是 [] ,空字符串渲染后是没有显示的内容的。 XSS:跨站脚本攻击。比如在一个可以提交数据的 HMTL 页面中写入一组或者多组标签 "<script>alert('hi')</script>",则在下次打开此页面时会出现弹窗。
{{ dict.name.upper }}
字符串的方法是不用加()的,而且没有参数 了解: locals() 可将函数中的所有数据全部传入页面中进行渲染,但是在开发中不建议使用。
三、模板の过滤器
1 常见的过滤器
date:{{ now|date:'Y-m-d H:m:s' }} 在前端页面格式化输出时间
可将date 看成函数,now 是第一个参数,: 后面是第二个参数
default:{{ ""|default:"value" }} 给空字符串设置一个默认值
length:{{ "string"|length }} 计算 string 字符串的长度
filesizeformat:{{ file|filesizeformat }} 将文件的大小格式化之后显示在前端页面
slice:{{ value|slice:'2:4' }} 将 value 值进行切片,顾头不顾尾
truncatechars:{{ value|truncatechars:6 }} 加上3个省略号总共显示6个字符
truncatewords:{{ words|truncatewords:3 }} 将 words 截断出3个,不包括省略号
safe:{{ tags_string|safe }} 将字符串标签渲染成 HTML 正常标签
add:{{ value1|add:value2 }} value1+value2
2 其它过滤器(了解)
过滤器 | 描述 | 示例 |
upper | 以大写方式输出 | {{ user.name | upper }} |
add | 给value加上一个数值 | {{ user.age | add:”5” }} |
addslashes | 单引号加上转义号 | |
capfirst | 第一个字母大写 | {{ ‘good’| capfirst }} 返回”Good” |
center | 输出指定长度的字符串,把变量居中 | {{ “abcd”| center:”50” }} |
cut | 删除指定字符串 | {{ “You are not a Englishman” | cut:”not” }} |
date | 格式化日期 | |
default | 如果值不存在,则使用默认值代替 | {{ value | default:”(N/A)” }} |
default_if_none | 如果值为None, 则使用默认值代替 | |
dictsort | 按某字段排序,变量必须是一个dictionary | {% for moment in moments | dictsort:”id” %} |
dictsortreversed | 按某字段倒序排序,变量必须是dictionary | |
divisibleby | 判断是否可以被数字整除 |
{{ 224 | divisibleby:2 }} 返回 True |
escape | 按HTML转义,比如将”<”转换为”<” | |
filesizeformat | 增加数字的可读性,转换结果为13KB,89MB,3Bytes等 |
{{ 1024 | filesizeformat }} 返回 1.0KB |
first | 返回列表的第1个元素,变量必须是一个列表 | |
floatformat | 转换为指定精度的小数,默认保留1位小数 | {{ 3.1415926 | floatformat:3 }} 返回 3.142 四舍五入 |
get_digit | 从个位数开始截取指定位置的数字 | {{ 123456 | get_digit:’1’}} |
join | 用指定分隔符连接列表 | {{ [‘abc’,’45’] | join:’*’ }} 返回 abc*45 |
length | 返回列表中元素的个数或字符串长度 | |
length_is | 检查列表,字符串长度是否符合指定的值 | {{ ‘hello’| length_is:’3’ }} |
linebreaks | 用<p>或<br>标签包裹变量 | {{ “Hi\n\nDavid”|linebreaks }} 返回<p>Hi</p><p>David</p> |
linebreaksbr | 用<br/>标签代替换行符 | |
linenumbers | 为变量中的每一行加上行号 | |
ljust | 输出指定长度的字符串,变量左对齐 | {{‘ab’|ljust:5}}返回 ‘ab ’ |
lower | 字符串变小写 | |
make_list | 将字符串转换为列表 | |
pluralize | 根据数字确定是否输出英文复数符号 | |
random | 返回列表的随机一项 | |
removetags | 删除字符串中指定的HTML标记 | {{value | removetags: “h1 h2”}} |
rjust | 输出指定长度的字符串,变量右对齐 | |
slice | 切片操作, 返回列表 | {{[3,9,1] | slice:’:2’}} 返回 [3,9]{{ 'asdikfjhihgie' | slice:':5' }} 返回 ‘asdik’ |
slugify | 在字符串中留下减号和下划线,其它符号删除,空格用减号替换 |
{{ '5-2=3and5 2=3' | slugify }} 返回 5-23and5-23 |
stringformat | 字符串格式化,语法同python | |
time | 返回日期的时间部分 | |
timesince | 以“到现在为止过了多长时间”显示时间变量 | 结果可能为 45days, 3 hours |
timeuntil | 以“从现在开始到时间变量”还有多长时间显示时间变量 | |
title | 每个单词首字母大写 | |
truncatewords | 将字符串转换为省略表达方式 |
{{ 'This is a pen' | truncatewords:2 }}返回 This is ... |
truncatewords_html | 同上,但保留其中的HTML标签 |
{{ '<p>This is a pen</p>' | truncatewords:2 }}返回 <p>This is ...</p> |
urlencode | 将字符串中的特殊字符转换为url兼容表达方式 | {{ ‘http://www.aaa.com/foo?a=b&b=c’ | urlencode}} |
urlize | 将变量字符串中的url由纯文本变为链接 | |
wordcount | 返回变量字符串中的单词数 | |
yesno | 将布尔变量转换为字符串yes, no 或maybe |
{{ True | yesno }} 返回 yes no maybe |
3 自定义过滤器
1 在 settings 中查看 app 是否注册 2 在 app 下写一个名字必须是 templatetags 的文件夹 3 在templatetags 文件夹下写一个自定义的 py 文件(如:test.py) 3.1 from django import template 3.2 register=template.Library() register 的名字不能改变 3.3 @register.filter() 括号中可以传 name=rename,也可以不传 3.4 def addstr(x,y): 可以自定义过滤器名字 return x+y 4 在模板中的使用: {% load test %} 先导入自定义的 py 文件 {{ str1|addstr:str2 }} 注意: 自定义的过滤器最多传2个参数; {{ str1|addstr:str2 }}可以当成 if 的条件
四、静态文件的配置另外两种方法(static)
{{% load static %}} 先导入static 方式一: <link href="{% staitic 'my_css.css' %}"> 这里的 static 指的就是 STATIC_URL 的 static,而 my_css.css 当成参数传给了static <link href="{% get_static_prefix %}my_css.css"> get_static_prefix 指的就是 STATIC_URL 的 static,然后手动跟 my_css.css拼接路径
五、模板语法の标签
1 for 标签
{% for foo in list %}
{{ foo }}
{{ forloop }}
{% empty %} empty 必须在 for 循环中使用,表示的是若list中有值,不执行下一步;若无值,则执行下一步
{% endfor %}
2 if 标签
{% if condition %} {{ name }} {% endif %} 注意: if 语句支持逻辑判断:< / = / > / != / in / not in / is / is not
3 with 重命名标签
方式一:
{% with rename=dic.name %} 相当于重新赋值
{{ dic.name }}
{{ rename }}
{% endwith %}
方式二:
{% dic.name as rename%}
{{ dic.name }}
{{ rename }}
{% endwith %}
4 自定义标签
1 在 settings 中查看 app 是否注册 2 在 app 下写一个名字必须是 templatetags 的文件夹 3 在templatetags 文件夹下写一个自定义的 py 文件(如:test.py) 3.1 from django import template 3.2 register=template.Library() register 的名字不能改变 3.3 @register.simple_tag(name='rename') 3.4 def my_sum(x,y): 可以自定义过滤器名字 code... 可以进行处理 return x+y 4 在模板中的使用: {% load test %} 先导入自定义的 py 文件 {% rename 参数1 参数2%} 以空格对参数进行分隔 注意: 自定义的标签可以有很多参数;
5 自定义标签与自定义过滤器最大的区别
自定义的标签不可做 if 判断的条件;
自定义的过滤器可以做 if 判断的条件。
六、模板の导入与继承
1 模板导入
模板导入就是将一个 HTML 页面的内容导入另一个 HTML 页面中。一般情况下,都是将页面中共有的部分单独提取出来,放入一个页面中,用的时候直接导入即可。
(1) 模板导入的语法
{% include '被模板名字.html' %}
(2) 访问方法
将上面的语法写至要打开的 HTML 页面的某一个位置时,只需要访问当前的 HTML 页面,即可在相应位置出现被导入模板的内容。
2 模板继承
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <link rel="stylesheet" href="style.css"/> 5 <title>{% block title %}My amazing site{% endblock %}</title> 6 </head> 7 8 <body> 9 <div id="sidebar"> 10 {% block sidebar %} 11 <ul> 12 <li><a href="/">Home</a></li> 13 <li><a href="/blog/">Blog</a></li> 14 </ul> 15 {% endblock %} 16 </div> 17 18 <div id="content"> 19 {% block content %}{% endblock %} 20 </div> 21 </body> 22 </html>
{% extends "base.html" %} {% block title %}My amazing blog{% endblock %} {% block content %} {% for entry in blog_entries %} <h2>{{ entry.title }}</h2> <p>{{ entry.body }}</p> {% endfor %} {% endblock %}
(1)模板继承的总结:
1️⃣ {% extends '母版.html'%} 是表示子模板继承了模板的 block 内容,而且 这个必须是写在子模板的第一行。
2️⃣ 写一个模板,假设是 base.html
3️⃣ 在 base.html 中设置一些盒子(即需要更改或者有可能更改的的地方),rename是别名
{% block rename %}
code...
{% endblock rename %}
4️⃣ 调用:super 表示还需要母版的内容,放在哪里就会显示在哪里(得在 block 之间)
{% extends 'base.html' %}
{% block rename %}
my code...
{{ block.supper }}
{% endblock rename %}
5️⃣ 若不继承盒子,会用原内容;若继承了盒子,但没写自己的内容,就会显示个空白
6️⃣ 盒子在继承时,跟顺序是没有关系的,endblock 后面也可以跟着上面 block 开始写的 rename,避免混淆
3 自定义 inclusion_tag
1️⃣ settings 中配置 app 2️⃣ app 目录下创建 templatetags 3️⃣ 写一个自定义的 py 文件,my_test.py 4️⃣ from django import template register=template.Library() @register.inclusion_tag('test.html') 自定义的 html 文件名 def my_inclusion(n): data=[] for i in range(10): data.append(i) return {'data':data} 5️⃣ 写 test.html 页面 <ul> {% for choice in dadta %} <li>{{ choice }}</li> {% endfor %} </ul> 6️⃣ {% load my_test %} {% my_inclusion 10 %}