Django--模板语言

一.变量

变量看起来就像这样{{variable}}

当模板引擎遇到一个变量,它将从上下文context中获取这个变量的值,然后用值替换掉它本身

变量的命名包括任何字母数字以及下划线('_')的组合.点('.')也有可能会在变量名中出现,不过它有特殊的含义.最重要的是变量名中不能有空格或标点符号

当模板系统遇到('.')它将以这样的顺序查询这个圆点具体代表的功能:

  • 字典查询
  • 属性或方法查询
  • 数字索引查询

如果你使用的变量名不存在,模板系统将插入string_if_invalid选项的值,默认设置为空字符串

注意,像{{ foo.bar }}这种模版表达式中的“bar”,如果在模版上下文中存在,将解释为一个字面意义的字符串而不是使用变量bar的值 。

二.过滤器

过滤器看起来是这样的{{name|lower}} 使用管道符号(|)来应用过滤器.该过滤器将文本转换成小写

过滤器可以“链接”。一个过滤器的输出应用于下一个过滤器。例如:{{ text|escape|linebreaks }}就是一个常用的过滤器链,它首先转移文本内容,然后把文本行转成<p>标签。

1.default

为false或者为空变量提供默认值

{{ value|default:"nothing" }}

2.length

返回值的长度,他对字符串的和列表都起作用

{{ value|length }}

3.filesizeformat

格式为'人类可读' 文件大小单位

{{ value|filesizeformat }}

三.标签

1.for 循环标签

循环对象中每个元素。需要结束标签{% endfor %} 。例如,显示athlete_list中提供的运动员列表

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}
</ul

2.if,elif,else标签

计算一个表达式,并且当表达式得值是TRUE时,显示块中的内容.需要{%endif%}结束标签 整体逻辑非常累是python的if elif else 

{% if athlete_list %}
    Number of athletes: {{ athlete_list|length }}
{% elif athlete_in_locker_room_list %}
    Athletes should be out of the locker room soon!
{% else %}
    No athletes.
{% endif %}

3.block和extends标签

继承和复写模板

四.注释

要注释模版中一行的部分内容,使用注释语法:{# #}

五.模板继承

Django模版引擎中最强大也是最复杂的部分就是模版继承了。模版继承允许你创建一个包含基本“骨架”的父亲模版,它包含站点中的共有元素,并且可以定义能够被子模版覆盖的blocks。

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css" />
    <title>{% block title %}My amazing site{% endblock %}</title>
</head>

<body>
    <div id="sidebar">
        {% block sidebar %}
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/blog/">Blog</a></li>
        </ul>
        {% endblock %}
    </div>

    <div id="content">
        {% block content %}{% endblock %}
    </div>
</body>
</html>

这个模版,通常被命名为base.html,它定义了一个可以用于两列排版页面的简单HTML骨架。

“子模版”需要做的是先继承父模板base.html,然后复写、填充,或者说实现其中的blocks。

block是在子模版中可能会被覆盖掉的位置。在上面的例子中,block标签定义了三个可以被子模版内容填充的block,分别是title、content和siderb

再看下面的例子,子模版可能看起来是这样的:

{% extends "base.html" %}

{% block title %}My amazing blog{% endblock %}

{% block content %}
{% for entry in blog_entries %}
    <h2>{{ entry.title }}</h2>
    <p>{{ entry.body }}</p>
{% endfor %}
{% endblock %}

extends标签是这里的关键。它告诉模版引擎,这个模版“继承”了另一个模版。当模版系统处理这个模版时,首先会去加载父模版,也就是“base.html”。

加载过程中,模版引擎将注意到base.html中的三个block标签,并用子模版中的内容来替换这些block。 根据blog_entries的值,最终输出可能看起来是这样的


8. 图片验证码
9. session会话
10. 注册视图
11.使用Django发送邮件
12. 邮件注册确认
13. 使用Github管理项目
实战二:CMDB之资产管理系统
1.项目需求分析
2.模型设计
3.数据收集客户端
4.Windows下收集数据
5.Linux下收集数据
6.新资产待审批区
7.审批新资产
8.已上线资产信息更新
9.前端框架AdminLTE
10.资产总表
11.资产详细页面
12.dashboard仪表盘
Django模板语言详解
阅读: 5985

本节将介绍Django模版系统的语法。Django模版语言致力于在性能和简单性上取得平衡。

如果你有过其它编程背景,或者使用过一些在HTML中直接混入程序代码的语言,那么你需要记住,Django的模版系统并不是简单的将Python嵌入到HTML中。

一、模板
模版是纯文本文件,可以生成任何基于文本的文件格式,比如HTML,XML,CSV等。

下面是一个小模版,它展示了一些基本的元素。

{% extends "base_generic.html" %}

{% block title %}{{ section.title }}{% endblock %}

{% block content %}
<h1>{{ section.title }}</h1>

{% for story in story_list %}
<h2>
  <a href="{{ story.get_absolute_url }}">
    {{ story.headline|upper }}
  </a>
</h2>
<p>{{ story.tease|truncatewords:"100" }}</p>
{% endfor %}
{% endblock %}
二、变量
变量看起来就像是这样: {{ variable }}。

当模版引擎遇到一个变量,它将从上下文context中获取这个变量的值,然后用值替换掉它本身。

变量的命名包括任何字母数字以及下划线("_")的组合。点(".")也有可能会在变量名中出现,不过它有特殊的含义。最重要的是,变量名称中不能有空格或标点符号。

当模版系统遇到点("."),它将以这样的顺序查询这个圆点具体代表的功能:

字典查询(Dictionary lookup)
属性或方法查询(Attribute or method lookup)
数字索引查询(Numeric index lookup)
如果你使用的变量不存在,模版系统将插入string_if_invalid选项的值,默认设置为''(空字符串)。

注意,像{{ foo.bar }}这种模版表达式中的“bar”,如果在模版上下文中存在,将解释为一个字面意义的字符串而不是使用变量bar的值 。

三、过滤器
过滤器看起来是这样的:{{ name|lower }}。使用管道符号(|)来应用过滤器。该过滤器将文本转换成小写。

过滤器可以“链接”。一个过滤器的输出应用于下一个过滤器。例如:{{ text|escape|linebreaks }}就是一个常用的过滤器链,它首先转移文本内容,然后把文本行转成<p>标签。

一些过滤器带有参数。 过滤器的参数看起来像是这样: {{ bio|truncatewords:30 }}。 这将显示bio变量的前30个词。

过滤器参数包含空格的话,必须用引号包起来。例如,使用逗号和空格去连接一个列表中的元素,你需要使用{{ list|join:", " }}。

Django提供了大约六十个内置的模版过滤器,很多时候你想要的功能,它都已经提供了,经常查看这些过滤器,发现新大陆吧。下面是一些常用的模版过滤器:

1. default
为false或者空变量提供默认值,像这样:

{{ value|default:"nothing" }}
2. length
返回值的长度。它对字符串和列表都起作用。

{{ value|length }}
如果value是['a', 'b', 'c', 'd'],那么输出4。

3. filesizeformat
格式化为“人类可读”文件大小单位(即'13 KB',4.1 MB','102 bytes'等)。

{{ value|filesizeformat }}
如果value是123456789,输出将会是117.7MB。

我们可以创建自定义的模板过滤器和标签,这是最终极的武器。

四、标签
标签看起来像是这样的: {% tag %}。

标签比变量复杂得多,有些用于在输出中创建文本,有些用于控制循环或判断逻辑,有些用于加载外部信息到模板中供以后的变量使用。

一些标签需要开始和结束标签(即 {% 标签 %} ... 标签 内容 ... {% ENDTAG %})。

Django自带了大约24个内置的模版标签。下面是一些常用的标签:

1. for循环标签
循环对象中每个元素。需要结束标签{% endfor %} 。例如,显示athlete_list中提供的运动员列表:

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}
</ul>
2. if,elif和else标签
计算一个表达式,并且当表达式的值是“True”时,显示块中的内容。需要{% endif %}结束标签。整体逻辑非常类似Python的if、elif和else,如下所示。:

{% if athlete_list %}
    Number of athletes: {{ athlete_list|length }}
{% elif athlete_in_locker_room_list %}
    Athletes should be out of the locker room soon!
{% else %}
    No athletes.
{% endif %}
在上面的例子中,如果athlete_list不是空的,运动员的数量将显示为{{ athlete_list|length }}。否则,如果athlete_in_locker_room_list不为空,将显示“Athletes should be out…”。如果两个列表都是空的,将显示“No athletes.” 。

还可以在if标签中使用过滤器和多种运算符:

{% if athlete_list|length > 1 %}
   Team: {% for athlete in athlete_list %} ... {% endfor %}
{% else %}
   Athlete: {{ athlete_list.0.name }}
{% endif %}
需要注意,大多数模版过滤器都返回字符串类型,所以使用过滤器做整数类型的比较通常是错误的,但length是一个例外。

3. block和extends标签
继承和复写模版。类似Python的类继承和重写机制。

五、注释
要注释模版中一行的部分内容,使用注释语法:{# #}。

例如,下面的模版将被渲染为'hello':

{# greeting #}hello
注释可以包含任何模版内的代码,有效的或者无效的都可以。 像这样:

{# {% if foo %}bar{% else %} #}
以上是单行注释(在{# .... #}中,不允许有新行)。

如果需要注释掉模版中的多行内容,请使用comment标签。

六、模板继承
Django模版引擎中最强大也是最复杂的部分就是模版继承了。模版继承允许你创建一个包含基本“骨架”的父亲模版,它包含站点中的共有元素,并且可以定义能够被子模版覆盖的blocks。

通过下面这个例子,理解模版继承的概念:

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css" />
    <title>{% block title %}My amazing site{% endblock %}</title>
</head>

<body>
    <div id="sidebar">
        {% block sidebar %}
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/blog/">Blog</a></li>
        </ul>
        {% endblock %}
    </div>

    <div id="content">
        {% block content %}{% endblock %}
    </div>
</body>
</html>
这个模版,通常被命名为base.html,它定义了一个可以用于两列排版页面的简单HTML骨架。

“子模版”需要做的是先继承父模板base.html,然后复写、填充,或者说实现其中的blocks。

block是在子模版中可能会被覆盖掉的位置。在上面的例子中,block标签定义了三个可以被子模版内容填充的block,分别是title、content和siderbar。

再看下面的例子,子模版可能看起来是这样的:

{% extends "base.html" %}

{% block title %}My amazing blog{% endblock %}

{% block content %}
{% for entry in blog_entries %}
    <h2>{{ entry.title }}</h2>
    <p>{{ entry.body }}</p>
{% endfor %}
{% endblock %}
extends标签是这里的关键。它告诉模版引擎,这个模版“继承”了另一个模版。当模版系统处理这个模版时,首先会去加载父模版,也就是“base.html”。

加载过程中,模版引擎将注意到base.html中的三个block标签,并用子模版中的内容来替换这些block。 根据blog_entries的值,最终输出可能看起来是这样的:

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css" />
    <title>My amazing blog</title>
</head>

<body>
    <div id="sidebar">
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/blog/">Blog</a></li>
        </ul>
    </div>

    <div id="content">
        <h2>Entry one</h2>
        <p>This is my first entry.</p>

        <h2>Entry two</h2>
        <p>This is my second entry.</p>
    </div>
</body>
</html>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值