6、模板层
一、模板语法之传值取值
# 注释
<!--HTML注释--> 浏览器能够查看
{#模板语法注释#} 浏览器查看不了
def reg(request):
# python基本数据类型
f = 1.1
i = 11
s = 'hello world'
l = [11,22,33,44]
d = {'username':"poco",'password':123}
t = (11,22,33,44,55,66,77)
se = {11,22,33,44,55,66}
b = True
# 函数(自动加括号调用函数 展示的是函数的返回值)
def func(args): # 模板语法不支持给函数传递额外的参数
print('from func')
return '我要午休!'
# 面向对象
class MyClass(object): # 自动加括号实例化产生对象
def get_obj(self):
return 'from obj'
@classmethod
def get_cls(cls):
return 'from cls'
@staticmethod
def get_func():
return 'from func'
obj = MyClass()
# 1.指名道姓的传(需要传的值较少)
return render(request,'reg.html',{...})
# 2.一次性批量传(效率偏低)
return render(request,'reg.html',locals())
###############################################################################
# 然后在前端页面用模板语法取值
<p>{{ l }}}</p>
<p>{{ i }}}</p>
......
'''
传函数名的时候 会自动加括号调用函数
将函数的返回值展示在html页面上
django模板语法不支持函数传参
django模板语法在获取容器类型内部元素的值的时候统一只采用 句点符(.)
比如说要拿到d = {'username':"poco",'password':123}中的名字
需要这样
<p>{{ i.username }}}</p>
<p>{{ l.0 }}</p>
'''
二、模板语法之过滤器(内置方法)
<p>过滤器: 管道符 左侧当做过滤器的第一个参数 右侧有时候还可以支持再传一个参数(冒号开头)</p>
<p>统计长度:{{ l|length }}</p>
<p>自增运算:{{ i|add:123 }}、拼接操作:{{ s|add:'你这渣渣' }}</p>
<p>日期转换:{{ ctime }}、{{ ctime|date:'Y-m-d' }}</p>
<p>文件大小:{{ file_size|filesizeformat }}</p>
<p>截取字符(三个点也算):{{ desc|truncatechars:6 }}</p>
<p>截取单词(三个点不算):{{ desc|truncatewords:3 }}</p>
<p>切片操作:{{ s|slice:'0:4' }}</p>
<p>默认值(判断布尔值):{{ b|default:'这个东西布尔值是False' }}</p>
<p>文本转义:{{ ht|safe }}</p>
<p>文本转义:{{ xss }}</p>
<p>文本转义:{{ ht1 }}</p>
###############################################################################
后端转义
from django.utils.safestring import mark_safe
ht1 = '<h1>一级标题</h1>'
ht1 = mark_safe(ht1)
三、模板语法之标签(流程控制)
{{}} 变量相关(引用变量值)
{%%} 逻辑相关(流程控制 模块方法)
# 后端视图层如下
def ab_file(request):
l = ['熊大','熊二','熊三','熊四']
b = True
return render(request,'file-form.html',locals())
###############################################################################
# for循环
{% for foo in l %}
{#<p>{{ forloop }}}</p>#}
<p>{{ foo }}</p>
{% endfor %}
# 前端就会在web页面显示后端视图层的列表啦
################################################
# if判断
{% if b %}
<p>我的宝贝~</p>
{% else %}
<p>你不是我的宝贝!</p>
{% endif %}
# 根据b的值来显示不同的内容
################################################
# if判断和for循环混合使用
{% for foo in l %}
{% if forloop.first %}
<p>你是啷个?</p>
{% elif forloop.last %}
<p>你像个憨包!</p>
{% else %}
<p>{{ foo }}}</p>
{% endif %}
{% endfor %}
# 运行结果
你是啷个?
熊二
熊三
你像个憨包!
四、自定义过滤器、标签、inclusion_tag
# 自定义过滤器必须要走下面三个步骤
'''
1.在应用下创建一个名字必须叫templatetags文件夹
2.在该文件夹内创建一个任意名称的py文件(如:mytag.py)
3.在py文件内必须要书写两行固定的代码
'''
from django.template import Library
register = template.Library()
# 自定义过滤器(参数最多两个)
@register.filter(is_safe=False,name='aaa') # 过滤器名字随便取
def my_plus(a,b):
return a + b
# HTML页面使用
{% load mytag %} # 固定写法,你新建的py文件叫什么,这里就写什么
{{ 10|aaa:2}}
# 结果:12
#######################################################################
# 自定义标签(自定义函数,参数可以有多个)
@register.simple_tag(name='bbb')
def func(a,b,c,d):
return '%s-%s-%s-%s'%(a,b,c,d)
# HTML页面使用
{% load mytag %}
<p>{% bbb 'poco' 123 456 789%}</p>
# 结果:poco-123-123-123
#######################################################################
# 自定义inclusion_tag
@register.inclusion_tag(filename='ccc.html')
def index(n):
data = ['第%s页' % i for i in range(1, n + 1)]
return locals()
# 然后去创建一个ccc.html的文件
<ul>
{% for foo in data %}
<li>{{ foo }}</li>
{% endfor %}
</ul>
# 然后在需要显示的HTML页面写入代码
{% load mytag %}
{% index 5 %}
# 显示结果
第1页
第2页
第3页
第4页
第5页
五、模板的继承和导入(重要内容)
你也没有遇到过这样一种场景,你在访问一个页面,点击了一些按钮,发现上面的部分和左边的侧边栏一直都不变的,只有中间的在变,这就是不变的内容继承了之前的页面。
1、继承和导入
我们现在先写一个首页,代码大概就是这样,具体内容就不展示了

然后我们看看前端显示的页面是这样的

现在我们的要求,点击左侧的注册按钮,然后就中间的图片区域变成注册的界面,顶部导航条和左侧的目录不变,很简单,我们先找到需要修改的代码

{% block 取个名字 %}
<div>这里是需要更改的代码</div>
{% endblock %}
# 这串代码框住谁,就代表被框住的代码不会被继承到新的页面上去
然后我们去需要继承的HTML文件
{% extends 'home.html' %} # 导入需要继承的html文件
{% block 你取的那个名字 %}
<h1 CLASS="text-center">注册页面</h1>
...
{% endblock %}
2、总结
# 首先创建一个页面,然后选择一个继承的页面,代码如下
{% extends 'home.html' %}
# 继承之后的子页面和被继承的模板页面一模一样,接下来需要去被继承页面划定修改的区域,如下
{% block content %}
<div>这里是需要更改的代码</div>
{% endblock %}
# 然后回到继承的页面
{% block content %}
<h1>写入该页面自己的代码</h1>
{% endblock %}
3、补充
一个页面上block块越多,页面的扩展性越高(当然也不能太多,太多还不如自己写)
通常情况下,都应该有三片区域(CSS、HTML、JS)
{% block css %}
...
{% endblock %}
{% block content %}
...
{% endblock %}
{% block js %}
...
{% endblock %}
模板的导入
"""
模板的导入思想类似于Python的导入模块
比如说当你写了一个特别好看的form表单,你想再多个页面上都使用这个form表单
你就可以将你写的form表单写在一个单独的HTML页面上,比如说叫做formNB.html
然后当作模块的形式导入,你想在哪个页面展示,就导入过来下面这行代码
"""
{% include 'formNB.html' %}

浙公网安备 33010602011771号