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' %}
posted @ 2021-05-31 20:55  黑影Poco  阅读(32)  评论(0)    收藏  举报