母版
1. tags 标签 {% %}
for循环
{% for name in name_list %}
{{ name }}
{% endfor %}
{% for name in name_list %}
{{ name }}
{% empty %} # 当列表中内容为空时执行的语句
空空如也
{% endfor %}
forloop {} 是个字典
forloop.counter 当前循环的索引值 从1开始
forloop.counter0 当前循环的索引值 从0开始
forloop.revcounter 当前循环的索引值 (倒叙) 到1结束
forloop.revcounter0 当前循环的索引值 (倒叙) 到0结束
forloop.first 当前循环是否是第一次循环 布尔值
forloop.last 当前循环是否是最后一次循环 布尔值
forloop.parentloop 当前循环的外层循环 ——》{}
if 判断
{% if 条件 %}
操作
{% endif %}
{% if 条件 %}
操作
{% elif 条件 %}
不同的操作
{% else %}
其他操作
{% endif %}
注意的事项:
1. django模板语言不支持连续的判断 a>b>c and连接
2. 不支持算数运算 +-*/ 使用过滤器
3. Django的模板语言中属性的优先级大于字典的方法
def xx(request): d = {"a": 1, "b": 2, "c": 3, "items": "100"} return render(request, "xx.html", {"data": d})
我们在使用render方法渲染一个页面的时候,传的字典d有一个key是items并且还有默认的 d.items() 方法,此时在模板语言中{{ data.items }}默认会取d的items key的值
{% with 变量 as 别名 %} 或 {% with 别名 = 变量%}
{{ 别名 }}
{% endwith %}
{{ 变量名 }}
变量名由字母数字和下划线组成。
点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值。
注:当模板系统遇到一个(.)时,会按照如下的顺序去查询:
- 1,在字典中查询 2,属性或者方法 3,数字索引
过滤器 filters
过滤器
1. 语法
{{ 变量名|filter:参数 }} 注意: '|'左右没有空格
2. 内置的filter
add:参数 加 数字相加 字符串拼接 列表拼接 {{ value|add:"2" }}
default:参数 变量不存在或者为空 显示默认值 {{ value|default:"nothing"}} 如果value值没传的话就显示nothing
filesizeformat 人性化显示文件大小,将文件大小转化成kb PB {{ value|filesizeformat }}
upper 大写
lower 小写
title 首字母大写
ljust:20 左对齐 {{ value|ljust:"20" }} 将变量放在20byte长度中对20个字符进行左对齐
rjust:20 右对齐
center:20 居中
length 长度 {{ value|length }} 返回value的长度
slice:'::' 切片 {{value|slice:"2:-1"}} 列表切片
join:'_' 拼接列表
first 取第一个元素
last 取最后一个元素
safe 取消对HTML代码的转义
date:'Y-m-d H:i:s' 日期的格式化 {{ value|date:"Y-m-d H:i:s"}}
truncatechars:18 文本上的时候进行截断 按18截断
2. 母版和继承 1. 母版 就是一个普通的HTML文件,提取多个页面的公共部分 减少代码量 修改十分方便 在html中定义block块 {% block page-main %} page-main是给这个block起的名字 ... block块中的内容是其他继承这个母版页面可以修改的 {% endblock %} 2. 使用(继承) 在子页面中 {% entends 'base.html' %} 继承母版 {% block page-main %} ... 重新修改block块中的内容,替换母版中的block {% endblock %} 3. 注意事项: 1. 把{% extends 'base.html' %} 写在第一行 2. 修改的内容写在block中,写在外面不显示 3. {% extends name %} name应该是变量 或者是字符串 继承母版的名字 4. 母版中定义多个block块,一般还有 js 块 和 css块 3. 组件 1. 就是一小段HTML代码 多个页面都用到的内容 nav.html 2. 在任意的模板中使用 {% include 'nav.html' %} 4. 静态文件相关 1. {% load staticfiles %} 或者 {% load static %} 2. {% static 'css/pub.css' %} ——》 先去settings中获取STATIC_URL的配置,和后面提供的参数进行拼接,推荐这种方式 1. {% load static %} 2. {% get_static_prefix %} 获取settings中静态文件的路径的前缀,然后作为字符串进行拼接 5. 自定义simpletag和自定义inclusion_tag 1. 在app下创建一个名叫templatetags的python包 2. 在templatetags里建一个py文件 3. 在py文件中编辑: from django import template register = template.Library() @register.simple_tag def join_str(arg1, arg2, arg3,*args,**kwargs): print(args) print(kwargs) return '_'.join([arg1, arg2, arg3])+'*'.join(args) @register.inclusion_tag('pagination.html') def pagination(total, current): return {'total': range(1, total + 1), 'current': current}
4.使用 {% load py文件名 %} {% 函数名 参数1 参数2 %}
# 自定义filter文件位置
app01/
__init__.py
models.py
templatetags/ # 在app01下面新建一个package package
__init__.py
mytags.py # 建一个存放自定义filter的py文件,自己起个名字
views.py
# ----myfilters.py文件
from django import template
register = template.Library()
# 自定义filter给过滤器起名字
@register.filter(name='dsb')
def add_sb(value, arg): # value是变量名(views中传入html的字典key),arg是传入的参数,name是过滤器的名字
return "{}_{}_sb".format(value, arg)
# 自定义filter
@register.filter
def add_sb(value, arg):
return "{}_{}_sb".format(value, arg)
# 自定义simple_tag
@register.simple_tag # simple_tag和filter类似,但是可以接收多个参数,filter只能接收一个参数
def join_str(arg1, arg2, arg3,*args,**kwargs): # 类似于filter,simple_tag也可以起名字
print(args)
print(kwargs)
return '_'.join([arg1, arg2, arg3])+'*'.join(args)
# 自定义inclusion_tag
@register.inclusion_tag('pagination.html')
def pagination(total, current):
return {'total': range(1, total + 1), 'current': current}
----------------------------------------------------------------------------
# -----templates下的html文件,模板
#使用自定义filter
{% load mytags %}
{{ name1|dsb:'very' }} # 'name1'是views中render传入的字典的key,接收变量, '|'是管道符, 'dsb'是过滤器的名字 ,'very'是传入的参数
#使用自定义的simple_tag
{% load mytags %}
{% join_str "1" "2" "abc" %}
#使用自定义的inclusion_tag
{% load mytags %}
{% pagination 10 5 %}
#inclusion_tag使用的片段html ,pagination.html,分页然后选中某一页
<div class="text-center">
<nav aria-label="...">
<ul class="pagination">
<li class="disabled"><a href="#" aria-label="Previous"><span
aria-hidden="true">«</span></a>
</li>
{% for num in total %}
{% if num == current %}
<li class="active"><a href="#">{{ num }}</a></li>
{% else %}
<li><a href="#">{{ num }}</a></li>
{% endif %}
{% endfor %}
<li><a href="#" aria-label="Next"><span aria-hidden="true">»</span></a></li>
</ul>
</nav>
</div>