• django4-模板进阶


    1.模板系统的语法

      引用变量数据: {{  }}

      标签逻辑操作:{%...%}

    2.变量

      变量名由字符数字下划线组成 ,可以执行由视图函数传过来的对象的方法和属性 ,但是视图函数中如果使用 ' . ' 执行对象的方法无法传参

    #views.py
    def test(request):
    lst = []
    dit = {}

    class person:
    def __init__(self, name, age):
    self.name = name
    self.age = age

    def echo(self):
    return '{}*{}岁'.format(self.name, self.age)

    def __repr__(self):
    return self.name
    p1 = person('qgw', 12)
    p2 = person('gwq', 15)
    lst.append(p1)
    lst.append(p2)

    dit['p1'] = p1
    dit['p2'] = p2
    return render(request, 'test-n.html', {'l': lst, 'd': dit,'p1':p1})
    #模板语法 ,不能使用括号() ,所以无法传参
    
    列表
    {# 取列表中的第一个参数,与后端索引类似 #}
    {{ l.0 }}
    
    字典  
    如果有键是keys ,那么优先级为先找键 ,再去找属性方法
    {# 根据字典的key取值 #}
    {{ d.name }}
    {# 字典的方法items取出kv对 ,keys取出所有的k ,values取出所有的v #}
    {{ d.items }}  {{ d.keys }}  {{ d.values }}
    
    对象相关
    {# 友好打印列表,返回一堆内存地址,这个调用了__repr__方法 ,重构repr即可 #}
    {{ p1 }}
    {# 取对象的name属性 #}
    {{ p1.name }}
    {# .操作只能调用不带参数的方法 #}
    {{ p1.echo}}  

    3. 变量二次处理

      变量可以使用管道做二次处理 ,过滤器是一些已经定义好的处理方法 ,管道可以有多个处理多次

      语法: {{ 变量|filter_name:参数 }}

      default   #给变量设置默认值

      add     #把变量拼接与参数

      length    #把变量的长度打印出来 ,不能对int类型操作

      slice    #切片

      first     #第一个元素

      last     #最后一个元素

      date    #将日期格式化

      truncatechars  #保留指定长度字符串 ,后续变为...

      safe    #如果是代码 ,不加safe默认是不执行的 ,以字符串显示 ,加了这个就可以执行

    4.标签逻辑操作

      常用逻辑有 for if with csrf_token url ,可以使用tab键补全格式

      1) for循环

        for循环内部可以使用的一些方法

        forloop.counter      #打印本次循环是第几次

        forloop.counter0       #打印本次循环是第几次(从0开始)

        forloop.revcounter       #倒叙打印本次循环第几次

        forloop.revcounter0     #倒叙打印本次循环第几次(从0开始)

        forloop.first        #如果是第一次循环 ,返回true

        forloop.last        #如果是最后一次循环, 返回false

        forloop.parentloop     #打印外层循环 (多层循环使用) ,可以在子循环中使用父循环的forloop的方法

        empty           #当整个for循环中empty以上代码没有生成 ,则执行empty下面的代码

    {% extends 'base.html' %}
    {% block body1 %}
        <table class="table table-bordered">
            {% for objlst in data %}
                {% for obj in objlst %}
                    <tr>
                {#将外层循环第一次的内容加上info颜色#}
                        <td {% if forloop.parentloop.first %}class='info'{% endif %}>{{ obj.name }}</td>
                        <td>{{ obj.age }}</td>
                        <td>{{ forloop.counter }}</td>
                    </tr>
                {% endfor %}
            {% empty %}
                <h1>isnone</h1>
            {% endfor %}
        </table>
    {% endblock %}

      2)if判断

        if运用比较灵活可以写在一个标签中 ,控制标签的属性 如: "<td {% if forloop.parentloop.first %}class='info'{% endif %}>{{ obj.name }}</td>"

    {% extends 'base.html' %}
    {% block body1 %}
        {% if 10 >= 9|add:2 %}        #add是加法和减法
            <h2>1</h2>
            {% else %}
            <h2>2</h2>
        {% endif %}
    {% endblock %}

      3)with别名

         with别名区域 ,在指定区域中一个变量可以通过别名方式引用

    {% extends 'base.html' %}
    {% block body1 %}
        {{ zheshiyige_obj.name }}
    
    {#别名方式#}
        {% with zheshiyige_obj as obj %}
            {{ obj.name }}
        {% endwith %}
    {% endblock %}

      

    5.模板与继承

      模板: 就是一个普通的html页面 ,但是是公共部分 ,有效避免代码重复 ,写多个不同的block块 ,子页面中逻辑的内容放入block中 ,通常css和js的引用也会设计一个block

      子页面继承模板方法 :

        页面第一行{% extends '模板.html' %}

        {% block 块名 %}

        {% endblock %}

    6.组件

      组件也是避免代码重复 ,是一小块代码 ,需要给很多页面使用

      组件使用 {% include 'html页面' %}

    #zj.html
    <h2>这里是oooo</h2>
    
    #其他页面引用
    {% include 'zj.html' %}

    7.静态文件配置名

      和路有别名作用差不多 ,为了防止static静态目录名的变更 ,我们将静态目录起个别名放在settings中 ,所有模板中引用静态文件的时候 ,直接使用静态文件别名或相对路径即可

    #settings.py
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'static')     #指定静态文件的根目录
    ]
    
    #html页面引用静态文件
    {% load static %}    #导入静态文件
    
    {% static '相对路径文件名' %} #引用静态文件
        
  • 相关阅读:
    web前端页面性能优化小结
    css3倒影
    jUploader: 基于jQuery文件上传插件
    java 异常的总结
    java 接口
    java 类的成员四初始化块
    java 集合总结
    java 操作集合的工具类Collections
    java 包装类及字符串与基本数据类型间的转换
    单例设计模式
  • 原文地址:https://www.cnblogs.com/quguanwen/p/11395230.html
Copyright © 2020-2023  润新知