Django之模板系统
模板系统
1,语法
- 两种特殊符号
- {{}}:变量相关
- {% %}:逻辑相关
2,变量
- 在Django的模板语言中按此语法使用:{{变量名}}
- 变量
- 字母数字下划线
- 不能含有空格或标点符号
- 深度查询:万能的点
- 字典查询
- 属性或方法查询
- 数字索引查询
3,过滤器
-
在Django的模板语言中,通过过滤器来改变变量的显示
-
语法:{{ value|filter_name:参数}}
-
使用管道符“|”来应用过滤器
-
注意事项
- 过滤器支持“链式”操作。即一个过滤器的输出作为另一个过滤器的输入。
- 过滤器可以接受参数,例如:{{ sss|truncatewords:30 }},这将显示sss的前30个词。
- 过滤器参数包含空格的话,必须用引号包裹起来。比如使用逗号和空格去连接一个列表中的元素,如:{{ list|join:', ' }}
- '|'左右没有空格没有空格没有空格
-
Django的模板语言提供了大约60个内置过滤器
-
default
-
默认值:如果一个变量是false或者为空,使用给定的默认值
-
{{value|default:“nothing”}}
-
-
length
-
返回值的长度,作用于字符串和列表
-
{{value|length}}
-
-
date
-
格式化:如果value= datetime.datetime.now()
-
{{value|date:“Y-md H:i:s”}}
-
-
truncatechars
-
如果字符串多余指定的字符串数量,那么会截断的字符串将以可翻译的省略号序列(“…”)结尾
-
参数:截断的字符数
-
{{ value|truncatechars:9}} #注意:最后那三个省略号也是9个字符里面的,也就是这个9截断出来的是6个字符+3个省略号,有人会说,怎么展开啊,配合前端的点击事件就行啦
-
-
truncatewords
-
在一定数量的字后截断字符串,是截多少个单词
-
value = "hello girl hi baby yue ma" {{value|truncatewords:3}} 上面的结果是:"hello girl hi..."
-
-
slice
-
value = “hello world" {{s|slice:"0:5"}} ---hello
-
-
join
- 使用字符串连接列表,{{ list|join:', ' }},就像Python的str.join(list)
-
safe
-
filesizeformat
-
将值格式化为一个“人类可读的”文件尺寸
-
{{ value|filesizeformat }}
-
-
cut
-
移除value中所有的与给出变量相同的字符串
-
{{ value|cut:' ' }} 如果value为'i love you',那么将输出'iloveyou'
-
-
timeuntil
-
似于timesince,除了它测量从现在开始直到给定日期或日期时间的时间。 例如,如果今天是2006年6月1日,而conference_date是保留2006年6月29日的日期实例,则{{ conference_date | timeuntil }}将返回“4周”。
使用可选参数,它是一个包含用作比较点的日期(而不是现在)的变量。 如果from_date包含2006年6月22日,则以下内容将返回“1周”:
{{ conference_date|timeuntil:from_date }}
-
4,标签tags
- for标签
- for … empty
- if 标签
- if… else
- with…
- with … as …
- carf_token
- 注释
5,模板继承
-
{% extends “base.html" %}
-
Django模版引擎中最强大也是最复杂的部分就是模版继承了。模版继承可以让您创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 blocks 。
-
如果你在模版中使用
{% extends %}
标签,它必须是模版中的第一个标签。其他的任何情况下,模版继承都将无法工作,模板渲染的时候django都不知道你在干啥。 -
在base模版中设置越多的
{% block %}
标签越好。请记住,子模版不必定义全部父模版中的blocks,所以,你可以在大多数blocks中填充合理的默认内容,然后,只定义你需要的那一个。多一点钩子总比少一点好。 -
为了更好的可读性,你也可以给你的
{% endblock %}
标签一个 名字 。例如: -
{% block content %} ... {% endblock content %}
在大型模版中,这个方法帮你清楚的看到哪一个 {% block %}
标签被关闭了。
- 不能在一个模版中定义多个相同名字的
block
标签。
6,组件
-
{% include "navbar.html" %}
-
组件是提供某一完整功能的模块,如:编辑器组件,QQ空间提供的关注组件 等。 而插件更倾向封闭某一功能方法的函数。 这两者的区别在 Javascript 里区别很小,组件这个名词用得不多,一般统称插件
7,自定义标签和过滤器
1,自定义标签
-
创建标签py文件
-
在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.
-
在app中创建templatetags模块(模块名只能是templatetags)
-
创建任意 .py 文件,如:my_tags.py
-
""" 这个py文件定义我们的标签和过滤器 """ from django import template from django.utils.safestring import mark_safe register = template.Library() @register.filter def func(v1): """ 自定义---有参数的过滤器,最多两个参数 :param v1: 变量的值,管道符前面的 :param v2: 传的参数,管道符后面的,如果不需要传参,就不需要添加这个参数 :return: """ return v1 + "熊大" @register.filter def foo(v1, v2): return v1 + v2 @register.simple_tag def my_input(id, arg): result = "<input type='text' id='%s' class='%s'/>" % (id, arg) return mark_safe(result) @register.inclusion_tag('result.html') def show_result(v1, v2): return {"li": [11, 22, 33, v1, v2, ]} @register.inclusion_tag('result.html') #多用于返回html代码片段 def show_result(n): #参数可以传多个进来 n = 1 if n < 1 else int(n) data = ["第{}项".format(i) for i in range(1, n+1)] return {"data": data}#这里可以穿多个值,和render的感觉是一样的{'data1':data1,'data2':data2....}
-
-
创建HTML文件
-
引入my_tag.py文件
-
{% load my_tags %}
-
HTML文件中调用,配合过滤器一起使用
-
{% load my_tags %} <!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> </head> <body> <h1>{{name|func}}熊二</h1> <h1>{{name|foo:"灰太狼"}}</h1> <div> {% my_input name "喜洋洋" %} </div> </body> </html>
-
8,静态文件相关
-
js、css、img等都叫做静态文件,那么关于django中静态文件的配置,我们就需要在settings配置文件里面写上这写内容:
-
# STATIC_URL = '/xxx/' #别名,随便写名字,但是如果你改名字,别忘了前面页面里面如果你是通过/xxx/bootstrap.css的时候,如果这里的别名你改成了/static/的话,你前端页面的路径要改成/static/bootstrap.css。所以我们都是用下面的load static的方式来使用静态文件路径 STATIC_URL = '/static/' #别名 STATICFILES_DIRS = [ os.path.join(BASE_DIR,'jingtaiwenjian'), #注意别忘了写逗号,第二个参数就是项目中你存放静态文件的文件夹名称 ]
-
前端页面引入静态文件的写法,因为别名也可能会修改,所以使用路径的时候通过load static来找到别名,通过别名映射路径的方式来获取静态文件
-
{% load static %} <img src="{% static "images/hi.jpg" %}" alt="Hi!" />
引用JS文件时使用:
{% load static %} <script src="{% static "mytest.js" %}"></script>
-
某个文件多处被用到可以存为一个变量
{% load static %} {% static "images/hi.jpg" as myphoto %} <img src="{{ myphoto }}"></img>
{% load static %} <img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />
或者
{% load static %} {% get_static_prefix as STATIC_PREFIX %} <img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" /> <img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!" />
注意一个html文件中写相对路径时需要注意的一个问题:
例子:
<form action="/login/"></form> <img src="/static/1.jpg" alt=""> 等标签需要写路径的地方,如果写的是相对路径,那么前置的/这个斜杠必须写上,不然这个请求会拼接当前网页的路径来发送请求,就不能匹配我们的后端路径了