zoukankan      html  css  js  c++  java
  • 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 '相对路径文件名' %} #引用静态文件
        
  • 相关阅读:
    Java Spring Boot VS .NetCore (十) Java Interceptor vs .NetCore Interceptor
    Java Spring Boot VS .NetCore (九) Spring Security vs .NetCore Security
    IdentityServer4 And AspNetCore.Identity Get AccessToken 问题
    Java Spring Boot VS .NetCore (八) Java 注解 vs .NetCore Attribute
    Java Spring Boot VS .NetCore (七) 配置文件
    Java Spring Boot VS .NetCore (六) UI thymeleaf vs cshtml
    Java Spring Boot VS .NetCore (五)MyBatis vs EFCore
    Java Spring Boot VS .NetCore (四)数据库操作 Spring Data JPA vs EFCore
    Java Spring Boot VS .NetCore (三)Ioc容器处理
    Java Spring Boot VS .NetCore (二)实现一个过滤器Filter
  • 原文地址:https://www.cnblogs.com/quguanwen/p/11395230.html
Copyright © 2011-2022 走看看