一.简介

它可以产生任何基于文本的的格式(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 %}

二.使用

1.变量

格式:

{{ variable }}

变量命名规则

1.变量的命名包括任何字母数字以及下划线 ("_")的组合

2.不能在变量名称中使用空格和标点符号

  • 字典查询(Dictionary lookup)
  • 属性或方法查询(Attribute or method lookup)
  • 数字索引查询(Numeric index lookup)

例;


{#如果后台 渲染传过来的是字典格式的数据 那么前端页面解析值 dict={"k1":"v1"} 假设传的是{"dict": dict} 前端页面取值 .字典key值#}
 
<h1>{{dict.k1}}</h1>

2.过滤器

  可以通过使用 过滤器来改变变量的显示

格式:

{{ name|lower }}

管道符过滤,一个过滤器的输出将被应用到下一个

过滤器参数;

{{ item.content |truncatewords:30 }}  <!-- 只显示 content 变量的前30个词 -->

default

{{ value|default:"nothing" }}   <!--如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值-->

length

它对字符串和列表都起作用

{{ value|length }}

filesizeformat

将该数值格式化为一个 “人类可读的” 文件容量大小 (例如 '13 KB''4.1 MB''102 bytes', 等等)

{{ value|filesizeformat }}

add

把add后的参数加给value

{{ value|add:"2" }}  <!--如果 value 为 4,则会输出 6.-->

capfirst

将变量首字母变大写

{{ value|capfirst }}  <!--如果value是test过滤后转为Test-->

cut

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

{{ value|cut:" " }}

dictsort

根据指定的key值对列表字典排序,并返回

{{ value|dictsort:"name" }}

如,给定的值是:

[
    {'name': 'peter', 'age': 19},
    {'name': 'amy', 'age': 22},
    {'name': 'jim', 'age': 31},
]

那么结果将是;

[
    {'name': 'amy', 'age': 22},
    {'name': 'jim', 'age': 31},
    {'name': 'peter', 'age': 19},
]

也可以处理较为复杂的;

{% for book in books|dictsort:"author.age" %}
    * {{ book.title }} ({{ book.author.name }})
{% endfor %}

如给定值为:

[
    {'title': '1984', 'author': {'name': 'George', 'age': 45}},
    {'title': 'Timequake', 'author': {'name': 'Kurt', 'age': 75}},
    {'title': 'Alice', 'author': {'name': 'Lewis', 'age': 33}},
]

那么结果为:

* Alice (Lewis)
* 1984 (George)
* Timequake (Kurt)

random

随机返回一个值

{{ value|random }}

如果 value 是 列表 ['a', 'b', 'c', 'd'], 可能输出的是 "b"

slice

切片

{{ some_list|slice:":2" }}

如果 some_list 是 ['a', 'b', 'c'], 输出结果为 ['a', 'b']

truncatewords

字符串截断

{{ value|truncatewords:2 }}

如果 value 是 "Joel is slug",输出  "Joel is ...".

3.标签

格式

{% tag %}

简介

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

有些标签需要开始标签和结束标签(例如{% tag %} ... tag contents ... {% endtag %}

常用标签;

for标签

格式

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

if,elif and else

计算一个变量,并且当变量是“true”时,显示块中的内容

格式:

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

4.注释

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

三.模版继承

模版继承可以让您创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 blocks 。

例;

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css" />
    <title>{% block title %}My amazing site{%/span> 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>

“子模版”的工作是用它们的内容填充空的blocks

子模版可能看起来是这样的:

{% extends "base.html" %}/span>

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

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

当模版系统处理这个模版时,首先,它将定位父模版——在此例中,就是“base.html”。

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>

使用继承的一个常用方式是类似下面的三级结构:

  • base.html 模版来控制您整个站点的主要视觉和体验。
  • base.html ,并且包含了每部分特有的样式和设计。
  • 这些模版继承对应分支的模版

母版结构

{% block content %}
...
{% endblock content %}

四.自动HTML转义

明确地说,下面五个字符被转义:

  • &lt;
  • &gt;
  • &#39;
  • &quot;
  • &amp;

如何关闭


autoescape标签 中

{% autoescape off %}
    Hello {{ name }}
{% endautoescape %}

下面是一个模板的示例:

Auto-escaping is on by default. Hello {{ name }}

{% autoescape off %}
    This will not be auto-escaped: {{ data }}.

    Nor this: {{ other_data }}
    {% autoescape on %}
        Auto-escaping applies again: {{ name }}
    {% endautoescape %}
{% endautoescape %}

例如:

{% autoescape off %}
<h1>{% block title %}{% endblock %}</h1>
{% block content %}
{% endblock %}
{% endautoescape %}
base.html

相关文章: