目录
常用语法
{{}} 变量相关
{% %} 逻辑相关
模板语法传值支持python的所有基本数据类型
def index(request):
#模板语法可以传递的后端数据类型
1=123
f=12.3
S='哈哈哈哈哈
b True
1=[111,222,333,444]
t=(1,2,3,4)
d={'name':'jason','age':15,'info':有点意思'}
se={'丽丽''haha''hehe'}
return render(request.'index.html'locals())
123
12.3
哈哈哈哈哈
True
[111,222,333,444]
(1,2,3,4)
'name':'jason','age':15,"info':'有点意思}
{'丽丽','hehe,'haha'}
内部能够自动判断当前的变量名是否可以 加括号调用,如果可以就会自动执行,针对函数名和类名
123
12.3
哈哈哈哈哈
True
[111,222,333,444]
(1,2,3,4)
'name':'jason','age':15,"info':'有点意思}
{'丽丽','hehe,'haha'}
我是返回值
#自动加括号调用,不支持传参
<app01.views.index.<locals>.MyClass object at 0x00000248E04EB4E0>
<app01.views.index.<locals>.MyClass object at 0x00000248E04D34A8>
变量
在Django的模板语言中按此语法使用:{{ 变量名 }}。
当模版引擎遇到一个变量,它将计算这个变量,然后用结果替换掉它本身。 变量的命名包括任何字母数字以及下划线 ("_")的组合。 变量名称中不能有空格或标点符号。
点(.)在模板语言中有特殊的含义。当模版系统遇到点("."),它将以这样的顺序查询:
字典查询(Dictionary lookup)
属性或方法查询(Attribute or method lookup)
数字索引查询(Numeric index lookup)
注意事项:
- 如果计算结果的值是可调用的,它将被无参数的调用。 调用的结果将成为模版的值。
- 如果使用的变量不存在, 模版系统将插入 string_if_invalid 选项的值, 它被默认设置为'' (空字符串) 。
模板语法之注释
{# 注释内容 #}
模板语法之过滤器
过滤器类似于内置函数,但是这种内置函数最多只能额外传输一个参数。
语法结构:{{ 数据对象|过滤器名称:参数 }}
常见的django过滤器
#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 }}
针对safe过滤器,我们也可以在后端实现:使用mark_safe方法后将结果传给页面,页面就能识别标签语法了。
from django.utils.safestring import mark_safe
tag = '<h1">内容</h1>'
res = mark_safe(ttt)
模板语法之标签
语法结构:
{{ 标签名称… }}
内容
{{ end标签名称 }}
if判断
{% if 条件1 %}
内容
{% elif 条件2 %}
内容
{% else %}
内容
{% endif %}
for循环
{% for 变量 in 容器类型 %}
内容
{% empty %} # 可不写
for循环对象为空时执行
{% endfor %}
自定义过滤器,标签和inclusion_tag
自定义过滤器
当内置的过滤器或标签无法满足我们需求时,我们可以自定义,具体操作步骤如下
1. 在settings中的INSTALLED_APPS添加当前app的名字,不然django无法找到自定义的过滤器或标签
2. 在文件夹app01中创建子文件夹templatetags(文件夹名只能是templatetags)
3. 在templatetags新建任意.py文件,
4. 新建的py文件内需要先提前编写两行固定的代码
from django import template
register = template.Library()
5. 使用时需要先使用模板语法导入py文件名
{% load py文件名 %}
6. 自定义过滤器或标签必须重新启动django方可生效
自定义的过滤器只能定义最多两个参数
#1、自定义过滤器
@register.filter
def my_multi_filter(v1 ,v2): # 自定义的过滤器只能定义最多两个参数,针对{{ value1 | filter_multi:value2 }},参数传递为v1=value1,v2=value2
return v1 * v2
使用:必须先加载存有自定义过滤器和标签的文件
#
{% load my_tags %}
{{ salary|my_multi_filter:12 }}
自定义的标签可以定义多个参数
#2、自定义标签
@register.simple_tag
def my_multi_tag(v1, v2): # 自定义的标签可以定义多个参数
return v1 * v2
使用:
{% my_multi_tag 1 2 %}
inclusion_tag
inclusion_tag可以把写好的一些标签放入到网页中。
该方法需要先作用于一个局部html页面,之后将渲染的结果放到调用的位置。
@register.inclusion_tag('content.html')
def func(n):
l1 = [i for i in range(n)]
return l1
content.html
<ul>
{% for i in l %}
<li>{{ i }}</li>
{% endfor %}
</ul>
页面调用:
{% func 10 %}
模板的导入
在实际开发中,模板文件彼此之间可能会有大量冗余代码,为此django提供了专门的语法来解决这个问题,主要围绕三种标签的使用:include标签、extends标签、block标签
比如我想要让home.html与index.html一样,那么我只需要将index.html导入到home.html中即可。
home.html
{% include ‘index.html’ %}
模板的继承
类似于面向对象中的继承:继承了某个页面就可以使用该页面上所有的资源
有很多差不多的页面 知识局部发生了变化 模板的继承可以很好的实现该需求
1.先在模板中通过block划定将来可以被修改的区域
{% block content %}
<h1></h1>
<p></p>
{% endblock %}
2. 子模板继承模板
{% entends ‘index.html’ %}
3.修改划定的区域
{% block centent %}
<h1></h1>
<p></p>
{%endblock%}
4.子页面还可以重复使用父页面的内容
{{block.super}}