filter:过滤器,用来修改变量的显示结果css
内置过滤器html
default:默认值python
filesizeformat:文件大小,将值格式化为可读的文件尺寸django
add:给变量加参数安全
length:返回长度app
slice:切片函数
first / last:取第一个/最后一个元素oop
join:使用字符串拼接列表ui
truncatechars:截断,按照字符计数翻译
date:日期格式化
语法:{{ value|date:"Y-m-d H:i:s"}}
在settings.py中配置:
USE_L10N = False DATETIME_FORMAT = 'Y-m-d H:i:s' # datetime类型 DATE_FORMAT = 'Y-m-d' # date类型 TIME_FORMAT = 'H:i:s' # time类型
配置后,使用{{now}}能够实现日期格式化
safe:告诉django这段代码是安全的,不须要转义
value = "<a href='#'>点我</a>"
在app下建立一个名为templatetags的python包
在templatetags中建立py文件,文件名自定义(my_tags.py);
在py文件中写:
from django import template register = template.Library() # register也不能变
写函数+装饰器
@register.filter def add_xx(value, arg): # 最多有两个 return '{}-{}'.format(value, arg) @register.filter(name='adds') # 至关于更改了函数名,使用时,使用新的函数名
在模板文件中使用,html文件
{% load my_tags %} {{ 'alex'|add_xx:'dsb' }}
注意:
符号:{% %}
for循环
<ul> {% for user in user_list %} <li>{{ user.name }}</li> {% endfor %} </ul>
Variable | Description |
---|---|
forloop.counter |
当前循环的索引值(从1开始) |
forloop.counter0 |
当前循环的索引值(从0开始) |
forloop.revcounter |
当前循环的倒序索引值(到1结束) |
forloop.revcounter0 |
当前循环的倒序索引值(到0结束) |
forloop.first |
当前循环是否是第一次循环(布尔值) |
forloop.last |
当前循环是否是最后一次循环(布尔值) |
forloop.parentloop |
本层循环的外层循环 |
{% for book in all_books %} <tr> ..... </tr> {% empty %} <td>没有相关的数据</td> {% endfor %}
if判断
{% if 条件1 %} xxx {% elif 条件2 %} xxx {% else %} xxxxx {% endif %}
with:给变量重命名,但只在with区域内生效
{% with hobby.2 as talk %} {# 至关于 {% with talk=hobby.2 %},其中=两边不能有空格 #} {{ talk }} {% endwith %}
csrf_token
符号:{# 要注释的内容 #}
快捷键:Ctrl + ?
{# 要注释的内容 #}
母板就是一个普通的html,提取多个页面的公共部分,经过定义block块来实现
<!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 %} {% endblock %} </head> <body> <h1>这是母板的标题</h1> {% block page-main %} {% endblock %} <h1>母板底部内容</h1> {% block page-js %} {% endblock %} </body> </html>
block块:
{% block 块名 %} {% endblock %}
注意:咱们一般会在母板中定义页面专用的CSS块和JS块,方便子页面替换
子页面继承母板:{% extends '母板html' %}
{% extends 'layouts.html' %}
子页面经过重写block块,来替换母板中相应的内容
{% block page-main %} <p>世情薄</p> <p>人情恶</p> <p>雨送黄昏花易落</p> {% endblock %}
组件:一小段html代码段
能够将经常使用的页面内容如导航条,页尾信息等组件保存在单独的文件中,而后在须要使用的地方导入
{% include 'navbar.html' %}
目的:更改setting中静态文件的别名时,不影响在更改以前的静态文件的引用,即引用会跟随别名的更改而自动更改,这样就不会报错了
方法一:使用static,本来路径:/static/images/hi.jpg
{% load static %} <img src="{% static "images/hi.jpg" %}" alt="Hi">
{% load static %} {% static "images/hi.jpg" as myphoto %} <img src="{{ myphoto }}">
方法二:使用get_static_prefix,本来路径:/static/images/hi.jpg
{% load static %} <img src="{% get_static_prefix %}images/hi.jpg" alt="Hi"> {# 补充:获取别名 #} {% get_static_prefix %}
{% load static %} {% get_static_prefix as STATIC_PREFIX %} <img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi">
和自定义filter相似,区别:接收的参数更灵活,能接收万能参数
定义注册simple_tag
@register.simple_tag def join_str(*args, **kwargs): return '{} - {} '.format('*'.join(args), '$'.join(kwargs.values())) @register.simple_tag(name='join') # 至关于更改了函数名,使用时,使用新的函数名
使用自定义simple_tag
{% load my_tags %} {% join_str '1' '2' k1='3' k2='4' %}
在app下的templatetags(python包)中建立py文件,文件名自定义(my_inclusion.py);
在py文件中写:
from django import template register = template.Library() # register也不能变
写函数+装饰器
@register.inclusion_tag('result.html') # result.html 是内容的html def show_results(n): n = 1 if n < 1 else int(n) data = ["第{}项".format(i) for i in range(1, n+1)] return {"data": data}
在result.html中写:
<ul> {% for choice in data %} <li>{{ choice }}</li> {% endfor %} </ul>
在模板文件中使用
{% load my_inclusion %} {% show_results 10 %}