一、简介
Django 模板是使用 Django 模板语言标记的文本文档或 Python 字符串。模板引擎可以识别和解释一些结构。主要的是变量和标签。
使用上下文呈现模板。渲染用它们的值替换变量,这些值在上下文中查找,并执行标签。其他一切都按原样输出。
{{ }}和 {% %}
二、变量
当模板引擎遇到变量时,它会评估该变量并将其替换为结果。变量名称由字母数字字符和下划线 ( ) 的任意组合组成,但不能以下划线开头,也不能是数字
语法
My first name is {{ first_name }}. My last name is {{ last_name }}.
三、过滤器
修改要显示的变量
常用模板过滤器
1、default
如果变量为假或空,则使用给定的默认值。否则,使用变量的值
{{ value|default:"nothing" }}
2、length
返回值的长度。这适用于字符串和列表
{{ value|length }}
3、filesizeformat
将值格式化为“人类可读”文件大小(即、 、等)
{{ value|filesizeformat }}
四、标签
标签看起来像是这样的: {% tag %}
。标签比变量更加复杂:一些在输出中创建文本,一些通过循环或逻辑来控制流程,一些加载其后的变量将使用到的额外信息到模版中。一些标签需要开始和结束标签 (例如{% tag %} ...
标签 内容 ... {% endtag %})。
for标签
循环遍历数组中的每个项目
<ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} </ul> if, elif, 和e
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 %}
五、模板继承
Django模版引擎中最强大也是最复杂的部分就是模版继承了。模版继承可以让您创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 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>
这个模板,我们称之为base.html
,定义了一个 HTML 框架文档,您可以将它用于两列页面。用内容填充空块是“子”模板的工作。
在这个例子中,block
标签定义了三个子模板可以填写的块。block
标签所做的只是告诉模板引擎一个子模板可以覆盖模板的那些部分。
子模板可能如下所示:
{% 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”。
此时,模板引擎会注意到其中的三个block
标签,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>
请注意,由于子模板没有定义sidebar
块,因此使用来自父模板的值。父模板中标签内的内容 始终用作后备。{% block %}
您可以根据需要使用尽可能多的继承级别。使用继承的一种常见方法是以下三级方法:
- 创建一个
base.html
包含网站主要外观的模板。 - 为您网站的每个“部分”创建一个
base_SECTIONNAME.html
模板。例如,base_news.html
,base_sports.html
。这些模板都扩展base.html
并包括特定于部分的样式/设计。 - 为每种类型的页面创建单独的模板,例如新闻文章或博客条目。这些模板扩展了相应的部分模板。
这种方法最大限度地提高了代码重用并有助于将项目添加到共享内容区域,例如部分范围的导航。
以下是使用继承的一些技巧:
-
如果在模板中使用,它必须是该模板中的第一个模板标签。否则,模板继承将不起作用。
{% extends %}
-
基本模板中的标签越多越好。请记住,子模板不必定义所有父块,因此您可以在多个块中填写合理的默认值,然后只定义您以后需要的那些。有更多的钩子比有更少的钩子更好。
{% block %}
-
如果您发现自己在多个模板中复制了内容,这可能意味着您应该将该内容移至父模板中的 a。
{% block %}
-
如果您需要从父模板中获取块的内容,该变量就可以解决问题。如果您想添加到父块的内容而不是完全覆盖它,这很有用。插入的数据不会被自动转义(参见下一节),因为如果需要,它已经在父模板中转义了。
{{ block.super }}
{{ block.super }}
-
通过使用与您继承相同的模板名称, 可用于在覆盖模板的同时继承模板。结合,这可能是进行小型自定义的强大方法。有关完整示例,请参阅 覆盖模板操作方法中的扩展覆盖模板。
{% extends %}
{{ block.super }}
-
使用模板标记语法在 a 之外创建的变量不能在块内使用。例如,这个模板不渲染任何东西:
{% block %}
{% translate "Title" as title %} {% block content %}{{ title }}{% endblock %}
注意:
不能block
在同一个模板中定义多个具有相同名称的标签。存在此限制是因为块标签在“两个”方向上工作。也就是说,块标签不仅提供了一个要填充的洞——它还定义了填充parent中的洞的内容。如果模板中有两个名称相似的block
标签,则该模板的父级将不知道要使用哪个块的内容。
标签:变量,标签,html,django,base,模板,block From: https://www.cnblogs.com/songyunjie/p/16870857.html