zoukankan      html  css  js  c++  java
  • Django之模板系统

    模板系统

    1,语法

    • 两种特殊符号
      • {{}}:变量相关
      • {% %}:逻辑相关

    2,变量

    • 在Django的模板语言中按此语法使用:{{变量名}}
    • 变量
      • 字母数字下划线
      • 不能含有空格或标点符号
    • 深度查询:万能的点
      • 字典查询
      • 属性或方法查询
      • 数字索引查询

    3,过滤器

    • 在Django的模板语言中,通过过滤器来改变变量的显示

    • 语法:{{ value|filter_name:参数}}

    • 使用管道符“|”来应用过滤器

    • 注意事项

      • 过滤器支持“链式”操作。即一个过滤器的输出作为另一个过滤器的输入。
      • 过滤器可以接受参数,例如:{{ sss|truncatewords:30 }},这将显示sss的前30个词。
      • 过滤器参数包含空格的话,必须用引号包裹起来。比如使用逗号和空格去连接一个列表中的元素,如:{{ list|join:', ' }}
      • '|'左右没有空格没有空格没有空格
    • Django的模板语言提供了大约60个内置过滤器

    • default

      • 默认值:如果一个变量是false或者为空,使用给定的默认值

      • {{value|default:“nothing”}}
        
    • length

      • 返回值的长度,作用于字符串和列表

      • {{value|length}}
        
    • date

      • 格式化:如果value= datetime.datetime.now()

      • {{value|date:“Y-md H:i:s”}}
        
    • truncatechars

      • 如果字符串多余指定的字符串数量,那么会截断的字符串将以可翻译的省略号序列(“…”)结尾

      • 参数:截断的字符数

      • {{ value|truncatechars:9}} #注意:最后那三个省略号也是9个字符里面的,也就是这个9截断出来的是6个字符+3个省略号,有人会说,怎么展开啊,配合前端的点击事件就行啦
        
    • truncatewords

      • 在一定数量的字后截断字符串,是截多少个单词

      • value = "hello girl hi baby yue ma"
        {{value|truncatewords:3}}
        上面的结果是:"hello girl hi..."
        
    • slice

      • value = “hello world"
        {{s|slice:"0:5"}}  ---hello
        
    • join

      • 使用字符串连接列表,{{ list|join:', ' }},就像Python的str.join(list)
    • safe

    • filesizeformat

      • 将值格式化为一个“人类可读的”文件尺寸

      • {{ value|filesizeformat }}
        
    • cut

      • 移除value中所有的与给出变量相同的字符串

      • {{ value|cut:' ' }}
         如果value为'i love you',那么将输出'iloveyou'
        
    • timeuntil

      • 似于timesince,除了它测量从现在开始直到给定日期或日期时间的时间。 例如,如果今天是2006年6月1日,而conference_date是保留2006年6月29日的日期实例,则{{ conference_date | timeuntil }}将返回“4周”。

            使用可选参数,它是一个包含用作比较点的日期(而不是现在)的变量。 如果from_date包含2006年6月22日,则以下内容将返回“1周”:

        {{ conference_date|timeuntil:from_date }}
        

    4,标签tags

    • for标签
    • for … empty
    • if 标签
    • if… else
    • with…
    • with … as …
    • carf_token
    • 注释
      • {# … #}

    5,模板继承

    • {% extends “base.html" %}
      
    • Django模版引擎中最强大也是最复杂的部分就是模版继承了。模版继承可以让您创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 blocks 。

    • 如果你在模版中使用 {% extends %} 标签,它必须是模版中的第一个标签。其他的任何情况下,模版继承都将无法工作,模板渲染的时候django都不知道你在干啥。

    • 在base模版中设置越多的 {% block %} 标签越好。请记住,子模版不必定义全部父模版中的blocks,所以,你可以在大多数blocks中填充合理的默认内容,然后,只定义你需要的那一个。多一点钩子总比少一点好。

    • 为了更好的可读性,你也可以给你的 {% endblock %} 标签一个 名字 。例如:

    •  

      {% block content %}
      ...
      {% endblock content %} 
      

      在大型模版中,这个方法帮你清楚的看到哪一个  {% block %} 标签被关闭了。

    • 不能在一个模版中定义多个相同名字的 block 标签。

    6,组件

    •  {% include "navbar.html" %}
      
    • 组件是提供某一完整功能的模块,如:编辑器组件,QQ空间提供的关注组件 等。
      
      而插件更倾向封闭某一功能方法的函数。
      
      这两者的区别在 Javascript 里区别很小,组件这个名词用得不多,一般统称插件
      

    7,自定义标签和过滤器

    1,自定义标签

    • 创建标签py文件

      • 在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.

      • 在app中创建templatetags模块(模块名只能是templatetags)

      • 创建任意 .py 文件,如:my_tags.py

      • """
        这个py文件定义我们的标签和过滤器
        """
        
        
        from django import template
        from django.utils.safestring import mark_safe
        
        register = template.Library()
        
        
        @register.filter
        def func(v1):
            """
            自定义---有参数的过滤器,最多两个参数
            :param v1: 变量的值,管道符前面的
            :param v2: 传的参数,管道符后面的,如果不需要传参,就不需要添加这个参数
            :return:
            """
            return v1 + "熊大"
        
        
        @register.filter
        def foo(v1, v2):
            return v1 + v2
        
        
        @register.simple_tag
        def my_input(id, arg):
            result = "<input type='text' id='%s' class='%s'/>" % (id, arg)
            return mark_safe(result)
        
        
        @register.inclusion_tag('result.html')
        def show_result(v1, v2):
            return {"li": [11, 22, 33, v1, v2, ]}
        
        
        @register.inclusion_tag('result.html')	#多用于返回html代码片段
        def show_result(n): #参数可以传多个进来
            n = 1 if n < 1 else int(n)
            data = ["第{}项".format(i) for i in range(1, n+1)]
            return {"data": data}#这里可以穿多个值,和render的感觉是一样的{'data1':data1,'data2':data2....}
        
        
    • 创建HTML文件

      • 引入my_tag.py文件

      • {% load my_tags %}
        
      • HTML文件中调用,配合过滤器一起使用

      • {% load my_tags %}
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <meta http-equiv="X-UA-Compatible" content="IE=edge">
            <meta name="viewport" content="width=device-width, initial-scale=1">
            <title>Title</title>
        </head>
        <body>
        <h1>{{name|func}}熊二</h1>
        <h1>{{name|foo:"灰太狼"}}</h1>
        <div>
            {% my_input name "喜洋洋" %}
        
        </div>
        </body>
        </html>
        

    8,静态文件相关

    •  js、css、img等都叫做静态文件,那么关于django中静态文件的配置,我们就需要在settings配置文件里面写上这写内容:

    • # STATIC_URL = '/xxx/' #别名,随便写名字,但是如果你改名字,别忘了前面页面里面如果你是通过/xxx/bootstrap.css的时候,如果这里的别名你改成了/static/的话,你前端页面的路径要改成/static/bootstrap.css。所以我们都是用下面的load static的方式来使用静态文件路径
      STATIC_URL = '/static/' #别名
      
      STATICFILES_DIRS = [
          os.path.join(BASE_DIR,'jingtaiwenjian'), #注意别忘了写逗号,第二个参数就是项目中你存放静态文件的文件夹名称
      ]
      
    • 前端页面引入静态文件的写法,因为别名也可能会修改,所以使用路径的时候通过load static来找到别名,通过别名映射路径的方式来获取静态文件

    • {% static %}

      {% load static %}
      <img src="{% static "images/hi.jpg" %}" alt="Hi!" />
      

      引用JS文件时使用:

      {% load static %}
      <script src="{% static "mytest.js" %}"></script>
      
    • 某个文件多处被用到可以存为一个变量

      {% load static %}
      {% static "images/hi.jpg" as myphoto %}
      <img src="{{ myphoto }}"></img>
      

      {% get_static_prefix %}

      {% load static %}
      <img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />
      

          或者

      {% load static %}
      {% get_static_prefix as STATIC_PREFIX %}
      
      <img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" />
      <img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!" />
      

      注意一个html文件中写相对路径时需要注意的一个问题:

      例子:

      <form action="/login/"></form>
      <img src="/static/1.jpg" alt="">
      等标签需要写路径的地方,如果写的是相对路径,那么前置的/这个斜杠必须写上,不然这个请求会拼接当前网页的路径来发送请求,就不能匹配我们的后端路径了
      
    希望你眼眸有星辰,心中有山海,从此以梦为马,不负韶华
  • 相关阅读:
    抽象类存在的意义
    抽象类的特征
    抽象类的使用
    抽象类的概述
    引用类型作为方法参数和返回值
    继承的特点
    目前Java水平以及理解自我反思---01
    继承后- 构造器的特点
    指针函数
    C数组灵活多变的访问形式
  • 原文地址:https://www.cnblogs.com/daviddd/p/12049940.html
Copyright © 2011-2022 走看看