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已经帮我们导入了

 

posted @ 2018-11-02 17:39  whuitian  阅读(83)  评论(0编辑  收藏  举报