• Python学习笔记-Day61和Day62-Django模板系统


    主要内容:

    一、模板语言-变量

    二、模板语言-过滤器

    三、模板语言Tags

    四、csrf-token

    五、母板

    六、组件

    七、静态文件相关

    八、自定义tag

    一、Django模板语言-变量

    1、语法:{{ 变量名 }}

    2、命名规则:所有的数字、字母、下划线的自由组合

    3、点(.)的作用

      ① 字典查询  {{ dic.key }}

      ② 属性、方法查询  {{ obj.name }}

      ③ 索引查询  {{ list1.0 }}

    二、Django模板语言-过滤器filter

    过滤器的作用是改变变量的显示

    1、语法:{{ 变量|filter_name:'参数' }}

      ① 过滤器支持链式操作,一个过滤器的输出可以作为另一个过滤器的输入

      ② 过滤器可以要接收参数

      ③ 过滤器中的参数是空格的话要用引号包起来

      ④ 管道符|左右两边没有空格

    2、Django中提供的内置的过滤器大概有60多中,列举以下几种

    ① default

    如果一个变量是false或空,就设置成默认的值

    {{ value|default:"nothing" }}

    ② length

    返回变量的长度,作用于字符串和列表

    {{ value|length }}

    ③ filesizeformat

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

    {{ value|filesizeformat }}

    如果value的值是123456789,输出的将是117.7MB

    ④ slice

    切片,和python中的切片是一样的,顾头不顾尾

    {{ value|slice:"1:-1"}}

    ⑤ date       ******

    格式化时间

    将一个datetime格式的时间格式化成我们想要的格式

    {{ now|date:"Y-m-d H:i:s"}}

    ⑥ safe

    为了安全,Django的模板中会对HTML标签和JS等语法标签自动转义成普通的字符串。

    但有时,我们不需要这些字符串被转义,就可以通过safe过滤器告诉Django这段代码是安全的不需要转义

    value = ‘<a href="#">点我</a>’

    {{ value|safe }}

    ⑦ truncatechars

    如果字符串中的字符多于指定的数量,那么会被截断,截断的字符将以可翻译的省略号序列(...)结尾,每个省略号代表一个字符

    {{ value|truncatechars:9}}   # 包括三个省略号在内,保留9个字符

    ⑧ truncatewords

    按照空格进行截断,因为中文不以空格作为单词的分割,所以这个过滤器对中文没有什么用处

    被截断的部分会以省略号(...)结尾

    ⑨ cut

    移除掉指定的字符

    {{ value|cut:'a'}}

    移除掉value中的a字符

    ⑩ join

    使用字符串连接列表,和python中的join一样

    {{ list|join:'&'}}

    ⒒ timesince

    {{ 以前的时间|timesince:之后的时间}}

    计算之前的时间和之后的时间的时间差,如果参数省略,就是计算以前的时间和现在的时间差

    最小的单位是分钟,如果以前的时间>之后的时间,返回“0分钟”

    ⒓ timeutil

    {{ 以后的时间|timeutil:之前的时间}}

    于timesince类似,计算以后的时间和之前的时间差

    三、自定义过滤器

    自定义过滤器只是一个带一个或两个参数的Python函数

    例如过滤器{{ value|foo:"bar" }}是将value和bar作为参数传递给foo,bar这个参数可以省略

    1、自定义filter的步骤

    ① 在app下新建一个Python package 名叫templatetags(一定要叫这个名)

    ② 在templatetags下新建一个py文件(名字随便取)my_filter.py

    ③ 在py文件中写函数,实现自定义的filter功能

    ④ 告诉Django框架多了一个自定义的filter

      from django import template

      register = template.Library()

      @register.filter(name='调用时使用的filter名字,可以和函数名不一样')

      def cut(value,arg):

        return value.replace(arg, '')

    2、使用自定义的filter

    ① 在HTML文件中导入py文件

    {% load my_filter %}

    ② 重启Django项目

    ③ 按照普通的使用filter的方法调用

    四、Tags(for、if、with)

    1、for循环

    ① 普通的for循环

    {% for user in user_list %}

    {% endfor %}

    for循环可用的一些参数 

    forloop.counter               当前循环的索引值(从1开始)   

    forloop.counter0             当前循环的索引值(从0开始)

    forloop.revcounter          当前循环的倒序索引值(从1开始)

    forloop.revcounter0        当前循环的倒序索引值(从0开始)

    forloop.first                     判断当前循环是不是第一次循环(布尔值)

    forloop.last                     判断当前循环是不是最后一次循环(布尔值)

    forloop.parentloop          本层循环的外层循环的索引值

    ② for...empty

    {% for user in user_list %}

    {% empty %}    # 如果user为空

    {% endfor %}

    2、if、elif、else

    {% if 条件 %}

    {% elif 条件 %}

    {% else %}

    {% endif %}

    if语句支持and、or、==、>=、<=、!=、in、not in、is not判断,但是不支持联级判断

    例如:不支持 if a>b>c

    3、with

    定义一个中间变量

    使用方法1:用as

    {% with business.employ.count as total%}

    {{ total }}employee{{ total|pluralize }}

    {% endwith %}

    使用方法2:用等号

    {% with total=business.employ.count %}  # 等号两边没有空格

    {{ total }}employee{{ total|pluralize }}

    {% endwith %}

    五、csrf_token

    用于防止跨站请求伪造。

    在form表单中加入{% csrf_token %}

    相当于在form表单中嵌入一个隐藏的input框,里面有Django发送的随机的字符串,Django在接收表单中的内容的时候,会通过这个字符串检测这个网站是不是由我的服务器发给你的

     六、母板

    1、什么情况下使用母板

      当多个页面的大部分内容都一样的时候,我们可以把相同的部分提取出来,放到一个单独的母板文件中

    2、如何使用母板

      ① 在母板文件中定义要被替换的块(block)

        {% block block_name %}

        {% endblock %}

      ② 在子页面中

        先继承母板 {% extend "母板.html" %}

        填充block

        {% block block_name %}

          html内容...

        {% endblock %}

     七、组件

    1、什么时候使用组件

      页面上相对独立的某个部分可以单独拿出来放到一个单独的html文件中

    2、如何使用

      在需要这个组件的地方调用 {% include "组件.html"%}

     八、静态文件相关{% load static %}

    1、为什么要使用静态文件相关

      因为当需要修改静态文件名的时候,需要将项目内所有引用静态文件的的地方都修改,工作量巨大,不如一开始就使用静态文件相关进行引用

    2、引用方法

    ① 使用 static

    {% load static %}

    <link rel="stylesheet" href="{% static 'css/my_css.css'%}">

    ② 使用get_static_prefix

    {% load static %}

    <link rel="stylesheet" href="{% get_static_prefix%}css/my_css.css">

     九、自定义tag

    和自定义filter相同,只不过接收更灵活的参数

    1、自定义的simple_tag

    ① 定义

    在app下的templatetags文件夹下新建一个py文件(和自定义filter相同,可以使用自定义filter创建的py文件)

    @register.simple_tag(name='plus')

    def plus(a,b,c):

      return '{}+{}+{}'.format(a,b,c)

    ②使用

    {% load py文件名 %}

    {% plus 1 2 "a" %}

    2、自定义的include_tag

    多用于返回html代码

    例如:展示不固定页数的分页

    ① 定义

    @register.inclusion_tag("nav.html")   # nav.html是要渲染的组件的html文件

    def page(num):

      data = [i for i in range(1, num+1)]

      return {"data":data}    # 相当于render的作用

    ② 在nav.html文件中有接收data参数的地方

    ③ 在要展示的页面中导入py文件,直接使用自定义的inclusion_tag

    {% load py文件名%}

    {% page 5%}         # 可以不需要导入组件,inclusion_tag中的return已经帮我们导入了

  • 相关阅读:
    [转]进程间通信----pipe和fifo
    [转]udev
    [转]netlink
    [转]进程间通信-----管道
    [转]socket
    [转]armv8 memory system
    [转]内核态和用户态
    [转]dpdk内存管理
    meeting and robert rules
    notion
  • 原文地址:https://www.cnblogs.com/tian-tian/p/9897516.html
Copyright © 2020-2023  润新知