过滤器(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的班级列表:
- {% for class in class_list %}
- { { class.name }} {% endfor %}
if,elif,else
{% if mark >90 %} grade : '优秀'{% elif 60<90 %} grade : '及格'{% else %} grade : '不及格'{% endif %}
注意{% if ***** %}要以{% endif %}来结束
模板继承
{% block title %}My amazing site{% endblock %} {% block content %}{% endblock %}
这个模板我们将它取名为base.html,定义了一个简单的HTML骨架文档,在一个简单的两列布局的页面你也许会用到它。子模板要做的就是将内容填充到空的区块中。
在这个例子中,标签block定义了三个可以让子模板重写的区块。每个block标签都会告诉模板引擎,子模板可能会重写该区块。
下面我们定义了一个子模板:
{% extends "base.html" %}{% block title %}My amazing blog{% endblock %}{% block content %}{% for entry in blog_entries %}{ { entry.title }}
{
{ entry.body }}{% endfor %}{% endblock %}
其中关键的地方是extends标签,这可以告诉模板引擎该模板是继承于其他模板。这样当模板系统执行该模板时,就可以先定位他的父模板,上面模板的父模板就是“base.html”。
在该例中,模板引擎会注意到在base.html中有三个block标签,然后会将子模板的内容填充到父模板相应的区块中。最后的结果如下({% block content %}区块里具体的内容是由blog_entries 变量决定的):
My amazing blog Entry one
This is my first entry.
Entry two
This is my second entry.
你可以根据需要采用多层继承,一般来讲我们采用的是三层继承:
- 首先创建一个包含网站主体外观的基础模板
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 % }内部使用的,