django 之模板层
1. 模板语法之变量
- 格式:
{{ 变量名 }}
句点符,深度查询(可以点到方法,不要加括号,只能是无参的方法) - 代码
视图函数:
from django.shortcuts import render
from django.utils.safestring import mark_safe
class Person:
def __init__(self,name):
self.name=name
@classmethod
def class_test(cls):
print('class method')
return 'class method'
def test(self):
print('method')
return self.name
# def __str__(self):
# return self.name
def index(request):
ss='lqz is big'
i=20
ll=['lqz',18,[1,2,[2,3]]]
ll4=[[1,2,3],[2,3,4],[1,2,9]]
dic={'name':'lqz','age':18,'t':[1,2,[2,3]]}
b=True
lqz=Person('lqz')
egon=Person('egon')
xiaohou=Person('xiaohou')
monkey=Person('monkey')
ll2=[lqz,egon,xiaohou,monkey]
dic2={'lqz':lqz,'egon':egon}
# print(lqz.class_test())
# print(dic['name'].upper)
ll3=[]
ss2=''
ss3='<a href="https://www.baidu.com">点我</a>' #链接
ss3=mark_safe(ss3) #不用转义网页正常显示
import datetime
now=datetime.datetime.now()
file=1024*1024*1024
return render(request,'index.html',locals()) #locals渲染所有的内容
# return render(request,'index.html',{'ss':ss,}) #指定单个内容渲染
模板:
<body>
<hr>
<p>字符串:{{ ss }}</p>
<p>数字:{{ i }}</p>
<p>列表:{{ ll }}</p>
句点符,做深度查询
<p>列表第2个值:{{ ll.2.2.0}}</p>
<p>布尔类型:{{ b}}</p>
<p>字典:{{ dic }}</p>
<p>字典取值:{{ dic.age }}</p>
<p>字典取值:{{ dic.t.2.1 }}</p>
<p>对象:{{ lqz }}</p>
<p>对象取值:{{ lqz.name }}</p>
执行方法,不要加括号,
<p>对象方法:{{ lqz.test }}</p>
<p>类方法:{{ lqz.class_test }}</p>
注释:前端看不到,django给处理了
{#<p>类方法:{{ Person}}</p>#}
<p>列表对象{{ ll2 }}</p>
<p>列表对象取值{{ ll2.1 }}</p>
<p>列表对象取值,在取值{{ ll2.1.name }}</p>
<p>对象字典{{ dic2 }}</p>
<p>对象字典取值{{ dic2.egon.name }}</p>
<p>空列表的情况{{ ll3 }}</p>
直接替换成空
<p>空字符串的情况{{ ss2 }}</p>
<p>a标签 {{ ss3 }}</p>
<h4>字典:{{ ss.upper }}</h4>
<h4>字典:{{ dic.name.upper }}</h4>
2.模板语法之过滤器
模板:
(1) date
注:冒号后不能加空格 now是第一个参数,冒号后面是第二个参数
<p>date过滤器 {{ now|date:'Y-m-d:H:i:s' }}</p>
<p>date过滤器 {{ now|date }}</p>
(2)default
如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如:
<p>default过滤器 {{ ss2|default:'字符串没有值' }}</p>
<p>default过滤器 {{ ll3|default:'列表没有值' }}</p>
(3)length 返回值的长度。它对字符串和列表都起作用
<p>length过滤器 {{ ll2|length }}</p>
(4) filesizeformat
将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如:
<p>filesizeformat过滤器 {{ file|filesizeformat }}</p>
<p>filesizeformat过滤器 {{ 1024|filesizeformat }}</p>
(5)slice 切片操作(同py数据类型切片)
<p>slice过滤器 {{ 'lqzisbig'|slice:'1:9' }}</p>
(6)truncatechars 截断字符
如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾
<p>truncatechars过滤器 {{ 'lqzisbigdddddddeee'|truncatechars:9 }}</p>
<p>truncatewords过滤器: {{ 'lqz is big and egon is small'|truncatewords:3 }}</p>
(7)safe 让django 不要转义网页,正常显示
<p>safe过滤器: {{ ss3|safe }}</p>
{#可以在视图函数里处理 ss3 = mark_safe(ss3)#}
(8)add 俩参数可以传字符串和数字,具体详见源码
<p>add过滤器: {{ 12|add:"3" }}</p> 结果:15
<p>add过滤器: {{ 'eee'|add:"3rrr" }}</p> 结果:eee3rrr
3. 模板语法之标签
3.1 for 标签
<h1>模板语法之标签</h1>
{# ll = ['lqz', 18, [1, 2, [2, 3]]]#}
{% for foo in ll %}
<p>{{ forloop }}</p>
{# 循环序号可以通过{{forloop}}显示 #}
{# {'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 3, 'revcounter0': 2, 'first': True, 'last': False}#}
<p>{{ forloop.counter }}</p> #当前循环索引从1开始计数 123
<p>{{ forloop.counter0 }}</p> #从0开始 012
<p>{{ forloop.revcounter }}</p> 321
<p>{{ forloop.revcounter0 }}</p> 210
<p>{{ forloop.first }}</p> #判断每次循环出的数是否是第一或者最后一次
<p>{{ forloop.last }}</p>
{# 遍历每一个元素#}
<p>{{ foo }}</p>
{# 判断实例:#}
{% if forloop.first %}
lqz is big
{% elif forloop.last %}
两人都小
{% else %}
egon is small
{% endif %}
{% endfor %} #必须要有结尾
#parentloop用法
{# ll4 = [[1, 2, 3], [2, 3, 4], [1, 2, 9]]#}
{% for foo in ll4 %}
{% for i in foo %}
<p>{{ forloop }}</p>
{# 在内层循环中拿到外层循环的forloop#}
<p>{{ forloop.parentloop }}</p>
{% endfor %}
{% endfor %}
# 循环出字典的值
{% for i in dic.values %}
<p>{{ i }}</p>
{% endfor %}
<hr>
{% for i in dic.keys %}
<p>{{ i }}</p>
{% endfor %}
<hr>
{% for key,value in dic.items %}
<p>{{ key }}---->{{ value }}</p>
{% endfor %}
3.2 for... empty
- 作用:for 标签带有一个可选的{% empty %} 从句,以便在给出的组是空的或者没有被找到时,可以有所操作
<!--视图中ll3=[]-->
{% for foo in ll3 %}
<p>{{ foo }}</p>
{% empty %} #要放在在for循环中,如果循环的对象为空,往下执行结果为'没有值'
没有值
{% endfor %}
3.3 with
- 作用:使用一个简单的名字缓存一个复杂的变量
{% with tt=dic.name %}
或者{% with dic.name as tt %}
给取出的内容重新赋值给tt
<p>{{ dic.name }}</p>
<p>{{ tt }}</p>
{% endwith %}
3.4 if
- 作用:{% if %}会对一个变量求值,如果它的值是“True”(存在、不为空、且不是boolean类型的false值),对应的内容块会输出。
{% if num > 100 or num < 0 %}
<p>无效</p>
{% elif num > 80 and num < 100 %}
<p>优秀</p>
{% else %}
<p>凑活吧</p>
{% endif %}
注:if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。
4. 自定义过滤器和标签
4.1 自定义过滤器
- 步骤
1 先去setting里面把app名字配置上
2 再app目录下创建一个templatetags模块
3 写py文件(my_test.py)
4 from django import template
5 register=template.Library()
6 写函数 addstr(用register.filter()装饰)
7 模板内容:
{% load my_test %}
{{'lqz'|addstr:'isbig' }} #最多只能传两个参数
- 代码:
my_test文件:
from django import template
register=template.Library()
@register.filter(name=tt)
def addrstr(x,y):
return x+y
模板:
<h1>自定义过滤器</h1>
{% load my_test %}
{# 过滤器可以是函数名,也可以是name指定的值 @register.filter(name=tt)#}
{{ 'lqz'|addrstr:'isbig' }} #lqzisbig 最多只能传两个参数
4.2 自定义标签
- 步骤:
1 先去setting里面把app名字配置上
2 再app目录下创建一个templatetags模块
3 写py文件(my_test.py)
4 from django import template
5 register=template.Library()
6 写函数
@register.simple_tag(name='yy')
def my_sum(x,y,z,i):
return x+y+z+i
7 模板:
{% load my_test %}
{% yy 12 34 56 78 %} #以空格做分割,传参数
代码:
my_test文件:
from django import template
@register.simple_tag(name='hh')
def sun(x,y,z):
return x+y+z
模板:
{% load my_test %}
{% hh 5 4 7 %} #以空格作分割,传参数
- 自定义的过滤器,可以放在if判断里,
自定义的标签,不能放在if判断里条件里
4.2 静态文件导入
方式一:
<link rel="stylesheet" href="/static123/mycss.css">
方式二:
{% load static %}
<link rel="stylesheet" href="{% static 'mycss.css'%}">
方式三:
{% load static %}
<link rel="stylesheet" href="{% get_static_prefix %}dd/ss/mycss.css">
5. 模板导入与继承
5.1 模板导入
1 把公共部分,放到html里,比如叫 left.html
2 想在哪里用 导入{% include 'left.html' %}
5.2 模板继承
1 写一个母模板 base.html
2 要更改的地方在block标签编辑
{% block base %}
母模板的盒子里也可以写东西
{% endblock %}
3 在其他文件中调用母模板{%extends 'base.html' %}
4 建盒子编辑自己的内容;
{% block base %}
自己的东西
{% endblock my_head%}
5 用母版里的内容({{block.super}} 放在那,原来母版里的东西,就会渲染在哪)
{% block base %}
{{block.super}}
自己的东西
{% endblock my_head%}
注:(1)如过不继承母模板盒子,它会用原来的内容;如果继承了,没写自己的东西,它会空白;写自己的内容就是什么内容,
通过{{block.super}},可渲染出原来母模板的内容
(2)盒子再继承时,跟顺序无关
6. inclusion_tag
- 作用:返回html代码片段
- 步骤
1 先去setting里面把app名字配置上
2 再app目录下创建一个templatetags模块
3 写py文件(my_test.py)
4 from django import template
5 register=template.Library()
6 @register.inclusion_tag('test.html')
def my_inclusion(n):
data=[]
for i in range(n):
data.append('第%s行'%i)
return {'data':data}
7 写test.html页面
<ul>
{% for choice in data %}
<li>{{ choice }}</li>
{% endfor %}
</ul>
8 视图函数中要渲染的页面
{% load my_test %}
{% my_inclusion 10 %} #它会返回html的页面