Django框架之模板层

Django框架之模板层

模板语法符号:css

{{ }} 变量相关的html

{% %} 逻辑相关的前端

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

一、模板语法之模板传值

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

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

一、指名道姓的传浏览器

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

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

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

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

前端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>

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

二、模板语法之过滤器

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

一、求数据的长度 | length

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

二、加法运算 | add

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

三、默认值 | default

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

四、截取字符 | truncatechar:n

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

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

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

六、文件大小 | filesizeformat

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

七、切片操做 | slice:'0:2'

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

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

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

九、转义 |safe

能够后端直接标识安全,在后端中处理,因此前端的代码能够在后端中写好传递给前端,能够作更多的逻辑语法

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

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

{% 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 %}

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

前期准备工做:

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

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

三、在该py文件内必须写如下两句代码

from django.template import Library
register = Library()

一、自定义过滤器

在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 %}

二、自定义标签

在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' %}

三、自定义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 %}

五、模板的继承

某一个页面上有不少部分是公用的,那这个页面就能够做为模板页面,别人继承这个页面后,能够修改对应的区域

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

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

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

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

三、子页面还能够支持调用父页面对应的区域,而且无限次调用,在content中调用就引用父页面的content中的内容,在哪一个里面调用就会引用父页面中的对应的内容

{{block.super}}

四、模板的导入

能够将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 %}