22 django之模板层(模板语法传值+模板语法之过滤器+模板语法之标签)
一、模板语法传值
url(r"^func/",views.func)
def func(request): i=111 f=11.1 s='jason' l=[11,22,33] d={"username":"jason","pwd":123} t=(11,22,33) b=True se={11,22,33,44}
下面的结果是注销__call__之后,对象点属性得到的结果
总结:
如何给html文件传值
1.字典挨个指名道姓
节省系统资源
2.locals()全部传递
节省人力资源 # 学习阶段就使用这种方式
1.python基本数据类型全部支持模板语法传值
2.在django中模板语法取值只能使用一种方式(句点符.)
3.针对函数名模板语法传值之后会自动加括号执行将返回值渲染到页面上
4.针对类名和对象名模板语法传值之后都会先加括号调用
类名加括号会产生对象
对象加括号不符合正常的调用方式 还是对象本身
但是会触发产生该对象类中的__call__方法
"""
小总结
django模板语法不支持函数传参
当需要引用变量名的时候使用双大括号 {{}}
"""
{{}} # 跟变量名相关
{%%} # 跟功能逻辑相关
二、模板语法之过滤器
# 相当于python的内置函数
#1、default #作用:如果一个变量值是False或者为空,使用default后指定的默认值,否则,使用变量本身的值,如果value=’‘则输出“nothing” {{ value|default:"nothing" }} #2、length #作用:返回值的长度。它对字符串、列表、字典等容器类型都起作用,如果value是 ['a', 'b', 'c', 'd'],那么输出是4 {{ value|length }} #3、filesizeformat #作用:将值的格式化为一个"人类可读的"文件尺寸(如13KB、4.1 MB、102bytes等等),如果 value 是 12312312321,输出将会是 11.5 GB {{ value|filesizeformat }} #4、date #作用:将日期按照指定的格式输出,如果value=datetime.datetime.now(),按照格式Y-m-d则输出2019-02-02 {{ value|date:"Y-m-d" }} #5、slice #作用:对输出的字符串进行切片操作,顾头不顾尾,如果value=“egon“,则输出"eg" {{ value|slice:"0:2" }} #6、truncatechars #作用:如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾,如果value=”hello world egon 嘎嘎“,则输出"hello...",注意8个字符也包含末尾的3个点 {{ value|truncatechars:8 }} #7、truncatewords #作用:同truncatechars,但truncatewords是按照单词截断,注意末尾的3个点不算作单词,如果value=”hello world egon 嘎嘎“,则输出"hello world ..." {{ value|truncatewords:2 }} #8、safe #作用:出于安全考虑,Django的模板会对HTML标签、JS等语法标签进行自动转义,例如value="<script>alert(123)</script>",模板变量{{ value }}会被渲染成<script>alert(123)</script>交给浏览器后会被解析成普通字符”<script>alert(123)</script>“,失去了js代码的语法意义,但如果我们就想让模板变量{{ value }}被渲染的结果又语法意义,那么就用到了过滤器safe,比如value='<a href="https://www.baidu.com">点我啊</a>',在被safe过滤器处理后就成为了真正的超链接,不加safe过滤器则会当做普通字符显示’<a href="https://www.baidu.com">点我啊</a>‘ {{ value|safe }}
{#<p>过滤器:(|) 将管道符左边的数据当做第一个参数传入过滤器中如果需要第二个参数 则名称后冒号</p>#}
<p>统计长度:{{ l|length }}</p>
<p>加法运算:{{ i|add:123 }}</p>
<p>默认值:{{ b|default:'布尔值为False' }}</p>
<p>时间格式:{{ ctime|date:'Y-m-d H:i:s' }}</p>
<p>截取字符(包含三个点):{{ ss|truncatechars:10 }}</p>
<p>截取单词(不包含三个点):{{ ss|truncatewords:3 }}</p>
<p>文件大小:{{ file_size|filesizeformat }}</p>
<p>转义:{{ s1|safe }}</p>
后端也可以转义
from django.utils.safestring import mark_safe
s2 = "<script>alert(123)</script>"
res = mark_safe(s2)
<p>标签:其实就是流程控制 if判断 for循环</p>
{% for foo in s %}
{% if forloop.first %}
<p>这是第一次循环</p>
{% elif forloop.last %}
<p>这是最后一次</p>
{% else %}
<p>继续!!!</p>
{% endif %}
{% empty %}
<p>传递过来的数据是空的</p>
{% endfor %}
{% if 条件1 %} 条件1成立执行的代码 {% elif 条件2 %} 条件2成立执行的代码 {% else %} 条件都不成立执行的代码 {% endif %} {% for i in data_list %} {{ forloop }} # first last counter0 counter {% empty %} # for循环对象内部没有值的情况下执行的代码 {% endfor %}