Django之模板

1.为什么使用模板系统

Django模板用来分离文档的展现和数据。为什么要分离展现和设计?因为Html页面改动频繁,就必然牵涉到python代码的改动,此外,两者分离会更加高效,减少等待时间。

模板本质是html文档,但中间有变量{{}}和模板标签{%%}

 2.模板渲染符号

变量相关的用{{}},逻辑相关的用{%%}

{{变量名}},包围的是变量,如{{person_name}},表示给定变量值的插入。

{%tag%},包围的是块标签。如{%if.... %} 它告诉模板做些事情。

 3.变量

在视图函数中,通过render方法将数据传给templates下的html文件。

render(request,’’login.html’’,{“变量1”:变量1变量2”:变量2})

通过字典的形式传值。字典处可以些locals(),代表将所有变量都传过去。测试时可以用,实际不用,而且效率低。传的值包括字典、列表、对象等

html中,直接写{{变量名}}调用。如果传来的是列表、字典,可以直接用.()的方式+索引(键)来取里面的值。比如{{dict.name}},{{list.0}}。在调用对象里面的方法的时候,不需要写括号来执行,并且只能执行不需要传参数的方法

 4.过滤器

1)过滤器介绍

过滤器用途:改变变量的显示。如{{value|filesizeformat}}表示将传来的值格式化一个可读的文件尺寸(如KBMB等)

过滤器语法:{{ value|filter_name:参数 }}

|是管道符。参数一般用双引号包裹。比如:{{bio|truncatewords:”30”}}表示显示bio变量的前30个字。

注意事项:'|'左右没有空格没有空格没有空格。过滤器参数包含空格的话,必须用引号包裹起来。

2)几个过滤器介绍

名称

用法

解释

default

{{ value|default:"null"}}

如果value没有传值或者值为空的话就显示null

length

{{ value|length }}

返回value的长度

filesizeformat

{{ value|filesizeformat }}

将值格式化为一个 人类可读的文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)

slice

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

切片,value="hello world",显示“llo worl”

date

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

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

safe

{{ value|safe}}

告诉Django这段代码是安全的不必转义(防止xss攻击,将html元素转义成文本)

truncatechars

{{ value|truncatechars:9}

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

truncatewords

{{ value|truncatewords:3}}

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

cut

{{ value|cut:值}}

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

join

{{ list|join:”值” }}

使用字符串连接列表。就像Pythonstr.join(list)

5.标签

格式:{% tag%}。告诉模板做些什么事。常用的有{%if %}{%endif%}{%for%}{%endfor%}

(1){%if %}标签

{%if%}的布尔值为真的话,就显示{%if%}{%endif%}之间的所有的内容。中间也可以有{%elif%}{%else%}

if语句支持 and or==><!=<=>=innot inisis not判断,注意条件两边都有空格。

2{%for%}

{%for%}允许按顺序遍历序列中的每个元素。每次循环模板系统都会渲染{%for%}{%endfor%}之间的内容。

{%for%}之间内置一个forloop模板变量,该变量含有一些属性可以提供循环的信息。并且只能在for循环内部使用。

循环字典:

{% for key,val in dic.items %}

    <p>{{ key }}:{{ val }}</p>

{% endfor %}

{{forloop}}几个重要的属性:

forloop.counter            当前循环的索引值(从1开始),forloop是循环器,通过点来使用功能

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

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

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

3{%csrf_token%}

csrf是跨站请求伪造,csrf_token是用来跨站请求伪造保护。在form表单里面任意位置写上{%csrf_token%},通过浏览器正常访问网页提交数据就可以成功。原因是:在form表单里面任意位置写上{%csrf_token%},模板渲染的时候替换成了<input type="hidden" name="csrfmiddlewaretoken" value="8J4z1wiUEXt0gJSN59dLMnktrXFW0hv7m4d40Mtl37D7vJZfrxLir9L3jSTDjtG8">,在提交数据的时候,请求体中携带了这个随机字符串,后台就可以根据这个验证。

 6.模板继承

Web开发有个重要的开发问题:如何减少一个常见页面区域的重复和冗余(如全站导航)。解决方式可以有在一个html里嵌套另一个页面。模板继承可以更好解决这个问题。模版继承可以让你创建一个基本的“骨架”模版,它包含您站点中的全部元素(包含网站的通用信息),并且可以定义能够被子模版覆盖的“块”。

1)母模板

母模板定义了其他页面使用的基本html框架。使用{%block%}标签告诉模板引擎一个子模版可能在这覆盖内容。

比如:

{% block title %}    {% endblock %}

 {% block sidebar %}    {% endblock %}

{% block content %}    {% endblock %}

最好在写成{% endblock  content%},更清晰。

2)子模版

子模版来填充母模板中有block的地方。

方法:首先要写{% extends "base.html" %}base.html是母模板的名称,extends告诉模板引擎这个页面继承了base.html

其次,在相应的地方替换:

{% block title %}    替换内容    {% endblock %}

{% block sidebar %}    替换内容    {% endblock %}

{% block content %}    替换内容    {% endblock %}

注意:

如果你在模版中使用 {% extends %} 标签,它必须是模版中的第一个标签

base模版中设置越多的 {% block %} 标签越好。请记住,子模版不必定义全部父模版中的blocks

{{ block.super }}可以得到母模版中的块内容。

 7.组件

可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方,文件的任意位置按如下语法导入即可。

{% include 'navbar.html' %}

posted @ 2020-02-20 19:50  yq055783  阅读(201)  评论(0编辑  收藏  举报