内置模板标签
-
格式 {% %}
-
注释
模板注释 {# 内容 #} 注释的所有东西全部隐藏 html注释 <!--内容--> #会在页面右键检查中显示
-
for
<ul> {% for user in user_list %} <li>{{ user.name }}</li> {% endfor %} </ul>
-
for循环可用的一些参数
参数 描述 forloop.counter 当前循环索引值(1开始) forloop.counter0
当前循环的索引值(从0开始) forloop.revcounter
当前循环的倒序索引值(到1结束) forloop.revcounter0
当前循环的倒序索引值(到0结束) forloop.first
当前循环是不是第一次循环(布尔值) forloop.last
当前循环是不是最后一次循环(布尔值) forloop.parentloop
本层循环的外层循环
-
-
for...empty
<ul> {% for user in user_list %} <li>{{ user.name }}</li> {% empty %} <li>数据内容不存在</li> {% endfor %} </ul> 页面显示:数据内容不存在
-
if、elif、else
{% if person_obj.age < 30 %} 年龄小 {% elif person_obj.age == 30% } 青年 {% else person.obj.age > 30 % } 中年
if语句支持:
>,<,>=,<=,==,!=,and,or,in,not in,is,is not
判断py:10>5>1--->相当于10>5 and 5>1 True js:10>5>1--->相当于10>5 true-->true>1 false # 模板中不支持连续判断,也不支持算术运算(过滤器代替)
-
with:定义一个中间变量
{% with hobby_list.2.3 as basketball %} {{basketball}} {% endfor %} {% with basketball=hobby_list.2.3 %} {{basketball}} {% endfor %}
-
csrf_token
csrf:跨站请求伪造
在form表单中添加{% csrf_token %} 打开中间件中的django.middleware.csrf.CsrfViewMiddleware
-
autoescape
:控制当前的自动转义行为,此标记以on或off作为参数,并确定自动转义是否在块内生效。该块以endautoescape结束标记关闭。
{% autoescape on %} //写需要转义的内容 {% endautoescape %}
-
控制转义还可以在py代码中
from django.utils.safestring import mark_safe def get_classlist(self): #使用mark_safe函数标记后,django将不再对该函数的内容进行转义 return mark_safe("<a href='#'>test</a>")
过滤器
内置过滤器
-
语法:
{{ value|filter_name:参数 }}
-
default
{{ value|default:'nothing' }} # 如果value值没传或者传的是空的话就显示nothing {{ xxx|default:'nothing' }} # nothing
注:TEMPLATES的OPTIONS可以增加一个选项:string_if_invalid:'找不到',可以替代default的的作用。
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR,'templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ ..... ], 'string_if_invalid':'找不到', # 页面会显示找不到 }, }, ]
-
filesizeformat
将格式转成“人类可读”的文件大小的值。
{{ value|filesizeformat }} {{ xxx|filesizeformat }} # 'xxx':1024 # 页面显示 1.0KB
-
add
将参数添加到值
{{value|add:'2'}} # 将2添加到value {{xxx|add:'2'}} # 'xxx':1024 {{xxx|add:2}} # 页面结果均为:1026 {{xxx|add:'2'}} # 'xxx':'1024' # 页面结果:1026 {{xxx|add:'2'}} # 'xxx':'abc' # 页面结果:abc2 {{xxx|add:'abc'}} # 'xxx':1024 # 页面结果:1024abc
{{xxx|add:yyy}} # 'xxx':['1', '20', '3'] 'yyy':['nihao', '20', '3'] # 页面结果:['1', '20', '3', 'nihao', '20', '3']
过滤器将首先尝试将两个值强制转换为整数。如果失败,它将尝试将值一起添加到一起。这将适用于某些数据类型(字符串,列表等),而对其他数据类型则失败。如果失败,结果将为空字符串。
-
lower:小写
{{ value|lower }} {{ string|lower }} # string = 'aBcDe' # 页面结果:abcde
-
upper:大写
{{ value|upper }} {{ string|upper }} # string = 'aBcDe' # 页面结果:ABCDE
-
title:标题
{{ value|title }} {{ string|title }} # string = 'aBcDe' # 页面结果:Abcde 将每个单词第一个元素大写
-
ljust:左对齐
{{ value|ljust:"10" }} # 参数:字段大小 如果value是Django,输出将是。"Django "
-
rjust:右对齐
{{ value|rjust:"10" }} # 参数:字段大小 如果value是Django,输出将是。" Django"
-
center:居中
{{ value|center:"10" }} # 参数:字段大小 如果value是"Django",输出将是。" Django "
-
length:返回长度
{{ value|length }} {{ string|length }} # string = 'aBcDe' # 页面结果:5
-
slice:切片
{{value|slice:"2:-1"}} {{ string|slice:'2:-1' }} # string = 'aBcDe' # 页面结果:cD {{ string|slice:'-2:0' }} # string = 'aBcDe' # 无法切出来,方向默认都是从左向右,如果想切出来加步长{{ string|slice:'-2:0:-1' }}
-
first:取第一个元素
{{value|first}} {{ string|first }} # string = 'aBcDe' # 页面结果:a
-
last:取第二个元素
{{value|last}} {{ string|last }} # string = 'aBcDe' # 页面结果:e
-
join:字符串拼接列表
{{ value|join:" // " }} <h1>{{ string|join:'***' }}</h1> # string = 'aBcDe' # 页面结果:a***B***c***D***e <h1>{{ lis|join:'***' }}</h1> # 页面结果:1***2***3***nihao
-
truncatechars
如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。
参数:截断的字符数 {{ value|truncatechars:9}} # value = 'asdfghjkl123456' # 页面结果:asdfgh... 三个省略号也占位
-
truncatewords
- 按照单词进行截断 只针对英文单词
-
date:日期格式化
{{ value|date:"Y-m-d H:i:s"}} value = datetime.now() # 2019-06-18 19:30:31
# setting 中的配置(全局) USE_L10N = False DATETIME_FORMAT = 'Y-m-d H:i:s'
-
safe
告诉django不需要转义
{{ value|safe}} # value = '<a href='#'>点我</a>' # 页面结果:点我 # 转义以后显示<a href='#'>点我</a>
-
divisibleby
如果值可以被参数整除,则返回True
{{ value|divisibleby:"3" }}
自定义过滤器filter
-
在
{% %}
中使用只能用filter,因为里面不能再套{% %}
,自定义sample_tag和inclusion_tag都不行 -
给变量用的,传入的参数有限制
-
在app下创建一个名为templatetags的python包,包名字必须是这个
-
在python中创建py文件,文件名自定义
-
进入py文件导入模块
from django import template register = template.Library() # register也不能变
-
写函数+装饰器
@register.filter def add_xx(value,arg): # 最多两个参数 第一个是value,第二个是过滤器参数(非必须,有些过滤器无参数) return '{}-{}'.format(value,arg) 注:在装饰器可加参数@register.filter(name='xxx'),那么使用时就不能使用函数名了,需要使用xxx这个名字
-
使用
{% load py文件名 %} # html文件中先导入py文件 {{ 'alex'|add_xx:'dsb' }} # 将alex给到py文件中函数第一个参数,dsb给到第二个参数
simple_tag用法
-
和自定义过滤器(filter)相似,参数不受限制
-
在app下创建一个名为
templatetags
的python包,包名字必须是这个 -
在python中创建py文件,文件名自定义
-
进入py文件导入模块
from django import template register = template.Library() # register也不能变
-
写函数+装饰器
@register.simple_tag def join_str(*args, **kwargs): # 接收任意个位置参数,任意个关键字参数 return '{} - {} '.format('*'.join(args), '$'.join(kwargs.values()))
-
使用
{% load py文件名 %} # 在html文件中导入py文件 {% join_str '1' '2' k1='3' k2='4' %} # 将位置参数给到py文件中join_str函数*args,关键字参数给到**kwargs
inclusion_tag用法
-
返回一个HTML代码段,比较灵活,会根据提供的参数进行相应的变化。
-
典型:分页
-
在app下创建一个名为templatetags的python包,包名字必须是这个
-
在python中创建py文件,文件名自定义
-
进入py文件导入模块
from django import template register = template.Library() # register也不能变
-
写函数+装饰器
@register.inclusion_tag('page.html') #参数是模板地址,一个HTML代码段 def page(num): # 接收参数 return {'num':range(1,num+1)} # 返回一个字典,将返回值传给模板进行渲染
-
在页面中使用
{% load my_tags %} # 调用模板,先导入py文件 {% page 2 %} # 将参数传给py文件中的page函数
母版与继承
-
母版:就是一个普通HTML提取多个页面的公共部分,定义block块
1.将公共部分拿出,单独放于一个HTML文件中,可供子文件调用 2.在html文件中定义一些block块,可让子文件替换成子页面独有的内容 如: {% block content%} {% endblock %}
-
继承:
1.先继承母版 {% extends ‘base.html’ %} 2.重写block块,替换模板位置的block,显示子页面独有内容 {% block content%} 子页面独有内容 {% endblock %}
{% extends ‘base.html’ %}
重写block块-----写子页面独特的内容
注意事项:
- {% extends 'base.html' %} 写在第一行 前面不要有内容 有内容会显示
- {% extends 'base.html' %} 'base.html' 加上引号 不然当做变量去查找
- 把要显示的内容写在block块中
- 可定义多个block块,定义 css js 块
组件
-
一小段HTML代码段 ——》 nav.html
-
{% include ‘nav.html ’ %} 导入组件
静态文件
-
{% load static %}和get_static_prefix
setting文件中STATIC_URL = '/static/'
导入{% load static %},使用以下方式,setting中别名改变,文件中会自动变
{% load static %}或者{% load staticfiles %} <link rel="stylesheet" href="{% static '/plugins/bootstrap-3.3.7/css/bootstrap.css'%}"> {% get_static_prefix %} ——> 获取别名 <link rel="stylesheet" href="{% get_static_prefix %}plugins/bootstrap-3.3.7/css/bootstrap.css">