zoukankan      html  css  js  c++  java
  • django—模板相关

    关于在html文件中使用模板语言时,一些符号的含义

      {{}}:显示变量相关,在模板渲染的时候替换成值

      {%%}:处理逻辑相关

    django模板语言中,对于列表字典等容器类型,不能够通过[ 索引/键值 ]的方式取值。

      可以通过点(.)加索引值的方式来取值:

        i.0  <====> 就是python语法中的 i[0]

        i.name <====> 就是python语法中的 i[ "name" ]

        i.keys <====> 就是python语法中的 i.keys()

        i.items <====> 就是python语法中的 i.items()

      通过点取值的优先级(从高到低排序):

    1. 在字典中查询 ,点后面的名称,会优先从字典的键值中匹配
    2. 属性或者方法, 其次去匹配类的属性或者方法
    3. 数字索引,最后才会去匹配数字索引

       优先匹配到什么就是什么

    标签

      1、for循环标签

        {% for i in l %}

          中间做逻辑处理/显示相应的数据

        {% endfor %}

        只要使用到for循环,每个for循环过程中,都有一个共同的属性: forloop

        forloop是一个字典,里面保存的数据如下:

          {'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 6, 'revcounter0': 5, 'first': True, 'last': False}

        通过forloop能够获取到for循环执行到某个轮次时的一些数据:

        forloop.counter : 取得当前轮次的序号(从1开始)

        forloop.counter0 :取得当前轮次的序号(从0开始) 

        forloop.revcounter : 取得当前轮次的序号(倒序,到1终止)

        forloop.revcounter0 : 取得当前轮次的序号(倒序,到0终止)

        forloop.first : 当前循环是否是第一轮次(布尔值,True or False)

        forloop.last : 当前循环是否是最后一轮次(布尔值,True or False)

        forloop.parentloop :如果当前循环外层还有一个循环,那么就能获取到此时的外层循环的forloop数据;

                  如果当前循环没有嵌套循环,那么该值就是空字典

      

      2、{% empty %}

        只能和for循环标签一起用,和if标签一起用报错

        用途:当for循环对象为空时(可能是视图函数传值问题,或者是处理后的值本身为空),显示{% empty %}后的数据

        

        {% for i in l %}
          {{ i }}
         {% empty %}
          无信息
        {% endfor %}

        只有 l 的值为空 : 空字符串、空列表、空字典、空集合等。特殊地,l为None时也能够触发for循环内的empty(亲自测试过,None不是不可迭代的吗...)

        只要l的有一个值,即便是字符串中的空格(" ")、列表中的空字符串[ "" ]等,都不会触发empty显示后续数据。

      3、if判断标签

        {% if  %}

          ...

        {% endif %}

        模板语言中,if支持的逻辑判断:

          not、and、or、==、>、<、>=、<=、!=、in、not in、is、is not

        不支持运算操作,如{% if 2+3 > 1%}。想在判断过程使用运算操作,可以使用filter(过滤器,add)

        不支持连续判断。

        python中的连续判断:   10 > 5 > 2      结果为True

          判断过程为:

              1、 10 > 5 为True

              2、 5 > 2 为True

              3、将两次判断的过程做and运算,即True  and  True,最终结果为True

        模板语言中的连续判断: 10 > 5 > 2  结果为False

          判断过程为:

            1、 10 > 5 为True, 对应的值就是1

            2、  1 > 2 为False,最终结果为False

          和js一样,模板语言是不支持类似python的连续判断机制。

     4、with起别名,为后续使用提供便利

        第一种写法:{%  with obj.name as name %}

        后续需要使用obj.name的话,可以直接用name替代

        {{ name }}  <====>   {{ obj.name }}

        第二种写法:{% with name = obj.name %}

    过滤器

      1、基本语法

      {{ 数据 |过滤器:参数}}

      过滤器和参数直接的冒号,左右两边不能有空格!!

      

      2、django内置的一些过滤器

      default:当数据为空时,显示default参数内的值。(数据为布尔值False时,也会触发default过滤器;为True时,正常显示True)

      add:数组加法/减法(将add的值改为负数即可)

          字符串的数字加减,最终也会显示数字。如{{ "4"| add:"2"}}显示6

          还可以做字符串拼接和列表拼接操作。如{{ "ab" | add:"cd"}}显示abcd,{{ [1,2] | add:[3,4]}}显示[1,2,3,4]

          列表拼接,必须是从视图函数中,传值过来的两个列表来做, {{ [1,2] | add:[3,4] }}这种形式无法调用add

      upper/lower/title:字母大写/小写/首字母大写(该过滤器不需要参数)

      length:取得当前数据的长度(不需要参数)

      date:将日期数据格式化显示(格式化模板和python有不同之处)

         {{ value|date:"Y-m-d H:i:s"}}    "Y-m-d H:i:s" 表示年月日时分秒

         python中的字符串格式化为   %Y-%m-%d %H:%M:%S

      过滤器可以连用,如{{ "abc" |upper|lower|title }}最终显示Abc

      更多的内置过滤器用法可以在官方手册中查看 

      3、自定义过滤器

        过滤器最多只能有两个参数,第一个参数是当前需要处理的值,第二个参数是处理第一个参数所需要的值

        过滤器可以只有第一个参数(如upper、lower、title)

        自定义过滤器的步骤:

          1、在对应的app下创建一个名为templatetags的python包;

          2、在该包下创建一个python文件,文件名自定义(如mytags);

          3、在该文件中先写上

              from django import template

              register = template.Library()

          4、接着写上自定义的过滤器函数,并为其加上装饰器(@register.filter)

          其中,templatetags和register不能写错!否则django识别不了自定义的过滤器

        自定义过滤器的使用:

          1、在需要用到自定义过滤器的模板文件中,引入自定义过滤器函数所在的python文件

            如{%  load mytags %}

          2、使用过滤器语法,调用过滤器  {{ 待处理数据 | 自定义过滤器:参数 }}

        注意:如果自定义过滤器是在django启动的情况下加入的,需要重启django服务器才能生效。

    模板

      1、模板的继承

        {%  extends "模板文件" %}

        模板文件必须用引号包裹,否则会被当成变量处理

        通常,将多个页面都会用到的公共部分放到一个文件中(母版),子文件在继承母版后,如果后续需要修改公共部分的元素,只需修改母版即可。

      2、块

        {%  block 块名 %}

                ......

        {% endblock %}

        每个继承母版的子页面中,不可能每个地方都和母版一致,这就需要在母版中,用block的方式将后续其他页面可能需要修改的地方标记起来;

        在子页面中,只需修改相应的块的内容,就能够实现将母版中对应的内容替换掉。

      3、一般情况下,模板的继承语句放在模板文件的第一行。

        这样的话,子页面中要展示的内容,就必须写在相应的block中,否则无法显示。

        除非,将要展示的内容,放在模板的继承语句之前。

      4、对于css、js需要将其标记在block中,以免子页面在继承母版的时候,继承到不必要的css和js

      5、组件

        {% include "组件名" %}

        把一个页面公用的部分单独写入一个文件,如导航栏。

        然后在需要用到的模板文件中,通过引入语句导入到文件中即可

        组件和母版:

          母版将所有页面共用的部分集合在一起。

          组件将单个公共部分抽离到一个文件,避免有些页面只需要某个单独部分,而不想继承母版的全部的内容。

    动态获取静态文件的路径

      在django的settings中,STATIC_URL表示静态资源的引用。

      每个静态文件的路径前必须有STATIC_URL作为前缀。

      如果将静态文件的路径写死,那么后续修改STATIC_URL值的话,需要将每个静态文件的路径修改一遍,极其繁琐。

      所以,可以通过模板语言来动态获取STATIC_URL的值,实现修改该值后,每个静态文件的路径都自动匹配上该值

      动态获取的步骤:

        先引入{%  load static %}

        方式1:<script  src=" {% static  'js/xxx.js' %}"></script>

        方式2:<script  src=" {% get_static_prefix %}js/xxx.js"></script>

  • 相关阅读:
    haproxy 2.5 发布
    cube.js sql 支持简单说明
    基于graalvm 开发一个cube.js jdbc driver 的思路
    apache kyuubi Frontend 支持mysql 协议
    oceanbase 资源池删除说明
    基于obd 的oceanbase 扩容说明
    jfilter一个方便的spring rest 响应过滤扩展
    cube.js schema 定义多datasource 说明
    typescript 编写自定义定义文件
    meow 辅助开发cli 应用的工具
  • 原文地址:https://www.cnblogs.com/yamx/p/13258648.html
Copyright © 2011-2022 走看看