Django框架之模板层

Django框架之模板层

模板语法符号:

{{ }} 变量相关的

{% %} 逻辑相关的

模板语法的注释:{# 注释的模板语法 #},浏览器是检查看不见的

1、模板语法之模板传值

python基本数据类型、函数、类、对象全部都支持传递给HTML文件

后端传递给HTML文件数据的两种方式

1、指名道姓的传

return render(request, 'index.html', {'res':dic})

2、locals() 会将当前名称空间中的所有变量名全部传递给HTML页面

return render(request, 'index.html', locals())

前端html页面如何获取传递过来的值:{{ 变量名 }}

前端html文件中通过模板语法取值,只有一种方式:句点符,不能通过.get()方式获取

可以通过点索引,点值,也可以通过连用句点符

<p>{{ l.2 }}</p>
<p>{{ d.username }}</p>
<p>{{ d.password }}</p>
<p>{{ d.hobby.1.username.1 }}</p>
<p>{{ func }}</p>
<p>{{ obj.get_static }}</p>
<p>{{ MyClass.get_static }}</p>

注意:当使用模板语法时,展示的是函数的返回值,并且引用函数名会加括号自动执行,模板语法,不支持有参函数的模板语法,传类名时也会自动加括号实例化

2、模板语法之过滤器

过滤器是用 | 表示,左边是过滤器的第一个参数,右边的会当做过滤器的第二个参数

1、求数据的长度 | length

<p>数据长度:{{ s|length }}</p>

2、加法运算 | add

{#只能数字之间或者字符串之间相加,不能混合使用#}
<p>加法:{{ s|add:'dsb' }}</p>

3、默认值 | default

{#默认值判断是否为空,不是空返回True,是空是返回冒号右边的#}
<p>b默认值:{{ b|default:'假时返回false' }}</p>
<p>bo默认值:{{ bo|default:'假时返回False' }}</p>

4、截取字符 | truncatechar:n

{#截取5个字符还有3个是点#}
<p>截取字符:{{ s|truncatechars:8 }}</p>

5、按照空格截取单词 | truncateword:n

{#按照空格截取截取4个单词,后面会有三个点不算进#}
<p>截取单词:{{ s|truncatewords:4 }}</p>

6、文件大小 | filesizeformat

<p>文件大小:{{ file_size|filesizeformat }}</p>

7、切片操作 | slice:'0:2'

{#可以按照步长来切片#}
<p>切片操作:{{ st|slice:'0:4' }}、{{ st|slice:'0:6:2' }}</p>

8、日期格式化 | date:'Y年/m月/d日'

{#可以支持日期格式操作#}
<p>日期格式化:{{ dd|date }}、{{ dd|date:'Y年/m月/d日' }}</p>

9、转义 |safe

可以后端直接标识安全,在后端中处理,所以前端的代码可以在后端中写好传递给前端,可以做更多的逻辑语法

# 后端中标识安全
from django.utils.safestring import mark_safe
re_safe = mark_safe('<h1>怎么这么好看</h1>')
<p>转义前端标识安全:{{ re|safe }}、后端已经标识安全了:{{ re_safe }}</p>

3、模板语法之标签(逻辑相关)

{% for foo in l %}
    {{ forloop }}
{% endfor %}

forloop拿到的是:

可以用forloop方法中的first和last判断是否是可迭代对象第一个和最后一个

{% for foo in l %}
    {% if forloop.first %}
        <p>第一个参数</p>
    {% elif forloop.last %}
        <p>最后一个参数</p>
    {% else %}
        <p>{{ foo }}</p>
    {% endif %}
{% endfor %}

for循环如果循环对象内部没有值,可以用empty来判断

{% for foo in l %}
    {% if forloop.first %}
        <p>第一个参数</p>
    {% elif forloop.last %}
        <p>最后一个参数</p>
    {% else %}
        <p>{{ foo }}</p>
    {% endif %}
    {% empty %}
        <p>for循环的对象中没有值</p>
{% endfor %}

for循环中也可以循环字典的所有键、所有值、所有的键值对

{% for foo in dic.keys %}
    <p>{{ foo }}</p>
{% endfor %}
​
{% for foo in dic.values %}
    <p>{{ foo }}</p>
{% endfor %}
​
{% for foo in dic.items %}
    <p>{{ foo }}</p>
{% endfor %}

当一个值获取的步骤非常繁琐的时候,我们可以起别名的方式来简化代码,别名只能在with中使用

{% with dic.hobby.1.small_hobby.1 as hob %}
    <p>{{ hob }}</p>
{% endwith %}

4、自定义过滤器、标签、inclusion_tag

前期准备工作:

1、在应用名下新建一个必须名为 templatetags 文件夹

2、在该文件夹内新建任意一个py文件

3、在该py文件内必须写以下两句代码

from django.template import Library
register = Library()

1、自定义过滤器

在templatetags文件内的py文件中自定义过滤器用 @register.filter(name='名字') 将名字传给前端,作为过滤器

注意:自定义过滤器中最多只能传两个参数

from django.template import Library
register = Library()
# 自定义过滤器
@register.filter(name='my_sum')
def index(a,b):
    return a + b

自定义过滤器的使用,在html文件中先要调用 load py文件 ,再使用过滤器

<p>自定义过滤器的使用</p>
{% load mytag %}
<p>{{ 10|my_sum:90 }}</p>
<p>自定义的过滤器可以在逻辑语句中而自定义的标签不可以</p>
{% if 10|my_sum:20 %}
    <p>条件成立</p>
{% endif %}

2、自定义标签

在templatetags文件内的py文件中自定义过滤器用 @register.simple_tag(name='名字') 将名字传给前端,作为标签,自定义标签可以有多个参数

# 自定义标签
@register.simple_tag(name='my_bq')
def aaa(a, b, c, d):
    return f"{a, b, c, d}"
# 返回多个值默认存入元组返回

自定义标签使用,需要先调用 load py文件 ,注意自定义的标签不能进行逻辑语句

{% load my_tag %}
{% my_bq 1 2 'abc' 'hello' %}

3、自定义inclusion_tag

自定义inclusion_tag将进行逻辑判断等一系列操作后的数据传递给第三方html文件渲染到页面上

使用 @register.inclusion_tag('html文件',name='名字'),将名字传递给前端进行传参给函数后引用第三方html文件将其渲染到页面上

# 自定义inclusion_tag
@register.inclusion_tag('login.html', name='my_in')
def xxx(n):
    l=[]
    for i in range(n):
        l.append(i)
    return locals()
<p>自定义inclusion_tag的使用</p>
{% load mytag %}
{% myin 5 %}

5、模板的继承

某一个页面上有很多部分是公用的,那这个页面就可以作为模板页面,别人继承这个页面后,可以修改对应的区域

1、先在模板页面上通过block划分区域,通常在模板页面应该划分最少三个区域,模板的block快越多,可扩展性就越高

            {% block css %} 
                模板页面内容CSS
            {% endblock %}
            {% block content %} 
                模板页面内容
            {% endblock %}
            {% block js %}  
                模板页面内容js代码
            {% endblock %}

2、在子页面上先清空整个HTML文件再导入整个模板,再继承该模板进行修改特定区域

1、导入整个模板
{% extends '模板页面.html'%}
2、修改特定的区域  通过实现划定好的区域名称
{% block content %}
        子页面内容
{% endblock %}

3、子页面还可以支持调用父页面对应的区域,并且无限次调用,在content中调用就引用父页面的content中的内容,在哪个里面调用就会引用父页面中的对应的内容

{{block.super}}

4、模板的导入

可以将html页面当做模块使用,哪里需要导哪里,通常这个HTML文件中只是局部的一个样式用

{% include '自定义的HTML文件' %}
{#    导入模板文件#}
{% extends 'mb.html' %}
{% block css %}
    <style>
    h1 {
        color: #4cae4c;
        background-color: #8a6d3b;
    }
    </style>
{% endblock %}
{% block content %}
    {#    引用自己的HTML文件#}
    {% include 'my_html.html' %}
    <h1 class="text-center">注册</h1>
<form action="" method="post">
                <p>username: <input type="text" name="username" class="form-control"></p>
                <p>password: <input type="password" name="password" class="form-control"></p>
                <input type="submit" class="btn btn-success">
</form>
{#    继承父页面的区域内容#}
    {{ block.super }}
    {{ block.super }}
    {{ block.super }}
    {{ block.super }}
{% endblock %}

 

posted @ 2020-01-08 01:01  Mr沈  阅读(166)  评论(0编辑  收藏  举报