过滤器(Filters)
filters来改变变量最终显示的值。
过滤器就像这样{{ name|lower }}。这是将name变量通过lower
过滤器全部转换为小写字母。|
用来调用过滤器。
过滤器可以是链式的,一个过滤器的输出会被用在下一个。{{ text|escape|linebreaks }} 是一种通用的形式用来将文本内容转义,然后再转为<P>标签以适用HTML。
有些过滤器带参数。例如以下带参过滤器:{{ bio|truncatewords:30 }}意思是只展示bio变量的前30个字符。
如果过滤器参数含有空格那么参数必须被引号引起来;比如想要用逗号和空格将list中的元素拼接起来,可以这样{{ list|join:“, ”}}。
default
如果一个变量是false或者是空的,那么它的值就是你给的默认值,否则就是变量本身的值。{{ value|default:"nothing" }}
如果变量value没有提供,或者是空的话,上面就会显示nothing
。
length
返回变量的长度。这对于字符串和列表都起作用。比如:
{{ value|length }}
如果 value是一个列表['a','b','c','d'],那么输出就是4。
filesizeformat
将文件大小转换为符合人们阅读习惯的格式(如:‘13 KB’,‘4.1 MB’,‘102 bytes’等)
{{ value|filesizeformat }}
如果value是123456789的话,那么输出将会是117.7MB。
标签
for
循环遍历数组或列表,比如展示名为class_list的班级列表:
<ul> {% for class in class_list %} <li>{{ class.name }}</li> {% endfor %} </ul>
if,elif,else
{% if mark >90 %}
grade : '优秀'
{% elif 60<mark<90 %}
grade : '及格'
{% else %}
grade : '不及格'
{% endif %}
注意{% if ***** %}要以{% endif %}来结束
模板继承
<!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骨架文档,在一个简单的两列布局的页面你也许会用到它。子模板要做的就是将内容填充到空的区块中。
在这个例子中,标签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”。
在该例中,模板引擎会注意到在base.html中有三个block标签,然后会将子模板的内容填充到父模板相应的区块中。最后的结果如下({% block content %}区块里具体的内容是由blog_entries 变量决定的):
<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
的模板,比如,base_news.html,base_sports.html。这些模板都是继承base.html模板,并且都有自己的设计样式。 - 为每一种类型的网页创建个性化模板,比如新闻或者博客,它们都是继承上述相应的部分模板
- 如果你要在模板标签中使用
{% extends %}
,那么它必须作为第一个模板标签,否则模板继承将失效。 - 在你的基础模板中多使用
{ % block % }
。记住,在子模板中不一定都要重写父模板的block标签,所以你可以在父模板中多定义些block,在里面填充合理的默认值,这样在子模板中你可以根据需要重写相应的block,其他的使用父模板的默认值就可以了 - 如果你发现在很多模板中有相同的内容,那么你可以将这些相同的内容提取出来放在父模板的block中。
- 如果你想获取父模板block中的内容,你可以使用变量{{ block.super }}。如果你想要增加父模板block的内容,而不是重写它,那么这个变量将会非常有用。使用该变量插入的数据不会被自动转义(下面会提到),因为如果有必要的话它已经在父模板中被转以了。
- 在{ % block % }标签外面用
as
标签创建的变量是无法在{ % block % }内部使用的,