母版
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>