五、模板层

一、模板语法的书写格式

    a. 变量相关
    
        {{ }}
    
    b. 逻辑相关
    
        {% %}

二、模板语法的传值

1. 给html页面传值的两种方式

    a. 指定值
    
        return render(request, 'test.html', {'name': 'byx'}) 
                
    b. locals(),传递当前名称空间中所有名字

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


2. 值的数据类型

    a. 支持所有python基本数据类型
    
    b. 只要是能加括号调用的,html会自动加括号调用(函数、对象.方法)
    
    c. 传函数名时,会展示函数返回值。
    
    d. 直接传对象,显示的是对象的地址

三、模板语法的取值

模板语法取值统一采用句点符

1. 点名字

    <p>{{ user_dict.name }}</p>

2. 点索引

    <p>{{ user_list.2 }}</p>

3. 链式取值

    <p>{{ user_dict.info.detail_info.2 }}</p>

4. 给数据起别名
    
    别名只能在with内部使用
    
    {{% with user_dict.info.detail_info.2 as asset %}}
    
    <p>{{ asset }}</p>
    
    {{% endwith %}}

四、模板语法之过滤器

1. 统计长度
    
    无法统计默认返回0
    
    <p>统计长度:{{ s|length }}</p>

2. 加法运算

    数字相加或字符串拼接,不符合时返回空

    <p>加法运算:{{ n|add:10 }}</p>
    <p>加法运算:{{ s|add:'byx' }}</p>

3. 切片操作

    顾头不顾尾

    <p>切片操作:{{ l|slice:'0:5:2' }}</p>

4. 转成文件大小格式

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

5. 截取文本内容
    
    a. 按字符截取,截取17个字符加上‘...’
    
    <p>截取文本内容:{{ text|truncatechars:20 }}</p>
    
    b. 按空格截取文本
    
    <p>截取文本内容:{{ text|truncatewords:20 }}</p>

6. 判断是否有值


    有值展示值,没值展示默认值
    
    <p>判断是否有值:{{is_value|default:'没接收到值'}}</p>

7. 展示带有标签的文本

    a. 除非前后端转义,不会转成html标签
    
        h = '<script>alert(123)</script>'
        
        <p>展示带有标签的文本:{{ h }}</p>
    
    b. 前端转义
    
        <p>展示带有标签的文本:{{ h|safe }}</p>
    
    c. 后端转义
    
        from django.utils.safestring import  mark_safe
        
        
        h = '<script>alert(123)</script>'
        h = mark_safe(h)
    

五、模板语法之标签

1. for循环

    a. 基本语法
    
        {% for foo in x %}
        
            <p>{{ forloop }}</p>
            <p>{{ foo }}</p>
        
        {% endfor %}
        
    
    b. forloop参数
    
        forloop.first        # 是否是第一个
        forloop.last         # 是否是最后一个
        forloop.counter      # 从1开始计数所在序号
        forloop.counter0     # 从0开始计数所在序号
    
            
    c. 当接收的对象为空时执行{% empty %}
    
        {% empty %}
                <p>现在打印我这句话</p>
        
    
2. if判断

    基本语法
    
        {% if s %}
            <p>s有值</p>
        
        {% else %}
            <p>s没有值</p>
        
        {% endif %}
        


3. for循环if判断结合示例

    {% for foo in l %}
    
        {% if forloop.first %}
            <p>这是第一条数据</p>
    
        {% if forloop.last %}
            <p>这是最后一条数据</p>
    
        {% else %}
            <p>{{ foo }}</p>
    
        {% endif %}
    
    {% endfor %}

六、自定义过滤器、标签和inclusion_tag

1. 前置步骤

    a. 在应用名下新建一个名字为templatetags的文件夹
    
    b. 在该文件夹内,新建一个py文件
    
    c. 在该py文件中写下下面代码
        
        from django.template import Library
        
        register = Library()

    
2. 自定义过滤器

    只能有2个参数

    a. py文件中编写
        
        @register.filter(name='tag1')
        def index(a, b):
            return a + b
    
    b. html页面中使用
    
        {% load mytag %}..0 
        <p>{{ 2|tag1:3 }}</p>
    
p.s 自定义的过滤器可以在逻辑语句中使用,自定义标签不行
    
        {% load mytag %}
        
        {% if s %}
            <p>s有值</p>
        
        {% else %}
            <p>s没有值</p>
        
        {% endif %}
    

3. 自定义标签

    能有多个参数,参数之间空格隔开

    a. py文件中编写
        
        @register.simple_tag(name='tag2')
        def index(a, b, c, d):
            return '%s%s%s%s' %(a, b, c, d)
    
    b. html页面中使用
    
        {% load mytag %}
        {% tag2 '1' '2' '3' '4' %}
    

4. 自定义inclusion_tag

    将传入的参数传给第三方html页面渲染,显示到当前html页面。当你使用一些页面组件,并且该页面组件需要参数才能正常渲染时使用。
    
    a. py文件中编写
    
        @register.inclusion_tag('mytag.html', name='tag3')
        def index(n):
            l = []
            for i in range(n):
                l.append('第%s项' %i)
            return locals()
    
    b. 第三方html页面
    
        <ul>
            {% for foo in l %}
                <li>{{ foo }}</li>
            {% endfor %}
        </ul>
    
    c. html页面

        {% load mytag %}
        {% tag3 10 %}

七、模板的继承

1. 继承方法

    a. 在原页面(home.html)上划定更改区域
    
        {% block myContent %}
        
                <div class="jumbotron"...>
        
        {% endblock %}
    
    b. 新页面
    
        {% extends 'home.html' %}
        
        {% block myContent %}
        
            自己修改的内容
        
        {% endblock %}

2. 可以用block.super沿用父类方法(可多次沿用)

        {% extends 'home.html' %}
        
        {% block myContent %}
        
            {{ block.super }}
            {{ block.super }}
        
        {% endblock %}


3. 通常一个模板页面包含三个区域:css区域、js区域和html区域。

八、模板的导入

1. 作用

    将html页面当做模块直接导入使用

2. 代码

    {% extends 'home.html' %}
    
    {% block myContent %}
        
        {{ block.super }}
        {{ block.super }}
        {% include 'form.html' %}
    
    {% endblock %}

猜你喜欢

转载自www.cnblogs.com/binyuanxiang/p/12052206.html
今日推荐