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>

  • 相关阅读:
    word-wrap与word-break为长单词换行
    background-origin与background-clip的“区别”
    box-shadow
    你不知道的border-radius
    当document.write 遇到外联script
    getAttribute()方法的第二个参数
    Backbone.js入门教程第二版笔记(3)
    Backbone.js入门教程第二版笔记(2)
    php中的字符串常用函数(二) substr() 截取字符串
    php中类和对象的操作
  • 原文地址:https://www.cnblogs.com/yamx/p/13258648.html
Copyright © 2011-2022 走看看