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来找到别名,通过别名映射路径的方式来获取静态文件

  • {% 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>
    

    {% 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="">
    等标签需要写路径的地方,如果写的是相对路径,那么前置的/这个斜杠必须写上,不然这个请求会拼接当前网页的路径来发送请求,就不能匹配我们的后端路径了
    
posted @ 2019-12-16 16:49  阿浪阿浪  阅读(121)  评论(0编辑  收藏  举报