什么是模板?
标签,过滤器,语法
变量
变量是这个样子的:{{ variable }}.当模板引擎遇到一个变量的时候,会用值去替换它。跟Python的变量相类似的是你可以用“.”去访问变量的属性。在上面的例子中,{{ section.title }}将会被section的属性title对象所替换。如果这个变量是不存在的话,那么就会使用一个默认值,这个默认值通常在TEMPLATE_STRING_IF_INVALID中设置。
过滤器
你可以使用过滤器去过滤你想显示的变量。比如说,你希望将一个list中的偶数都去掉,那么就可以使用过滤器。具体的使用方法像这样:{{ name|lower }}。name的值会被lower这个过滤器过滤。有点类似于linux中的管道。当然他也可以像管道一样连续的进行过滤:{{ name|escape|linebreak }},这就是一种常见的过滤方法,主要用来将所有的换行符用<p>标签去替换。说的通俗一点,escape就是换码。
过滤器也可以接收参数,比如说{{ bio|truncatewords:30 }},这用来显示bio的前30个单词。如果你想把一个list中的字符串都连成一个字符串并且用", "隔开,那么可以使用{{ List|join:", " }}。Django提供了很多的过滤器,你可以去参考链接 https://docs.djangoproject.com/en/1.5/ref/templates/builtins/#ref-templates-builtins-filters
标签
标签长的像这个样子{% tag %}.标签比变量要复杂一些:因为标签要负责控制逻辑。下面介绍一些常用的标签:
for
为了显示出一个list num_list中的所有的数据,你可以使用for标签,使用方法如下:
逻辑含义很简单,举个例子
注释的写法如下:{# greeting #}hello,这个注释只能注释一行。无法注释多行
模板继承
这一部分是模板里面最强大的部分,非常的有意思,如果这个你不懂的话,那就不能说你知道django里的模板了。其实说模板继承这种概念是把继承这个东西给泛化了,不再那么局限于语言。这里的继承实际上就是简单的在原来一个基框架上增加东西,也可以覆盖基框架的一些东西。在Django的官网上有一个不错的例子,我在这里也举出来:
模板是一种简单的文本文件,它可以生成其他任何的基于文本格式的文件,比如说: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 }}.当模板引擎遇到一个变量的时候,会用值去替换它。跟Python的变量相类似的是你可以用“.”去访问变量的属性。在上面的例子中,{{ section.title }}将会被section的属性title对象所替换。如果这个变量是不存在的话,那么就会使用一个默认值,这个默认值通常在TEMPLATE_STRING_IF_INVALID中设置。
过滤器
你可以使用过滤器去过滤你想显示的变量。比如说,你希望将一个list中的偶数都去掉,那么就可以使用过滤器。具体的使用方法像这样:{{ name|lower }}。name的值会被lower这个过滤器过滤。有点类似于linux中的管道。当然他也可以像管道一样连续的进行过滤:{{ name|escape|linebreak }},这就是一种常见的过滤方法,主要用来将所有的换行符用<p>标签去替换。说的通俗一点,escape就是换码。
过滤器也可以接收参数,比如说{{ bio|truncatewords:30 }},这用来显示bio的前30个单词。如果你想把一个list中的字符串都连成一个字符串并且用", "隔开,那么可以使用{{ List|join:", " }}。Django提供了很多的过滤器,你可以去参考链接 https://docs.djangoproject.com/en/1.5/ref/templates/builtins/#ref-templates-builtins-filters
标签
标签长的像这个样子{% tag %}.标签比变量要复杂一些:因为标签要负责控制逻辑。下面介绍一些常用的标签:
for
为了显示出一个list num_list中的所有的数据,你可以使用for标签,使用方法如下:
<ul>
{% for num in num_list %}
<li>{{ num }}</li>
{% endfor %}
</ul>
if and else逻辑含义很简单,举个例子
{% if num_list %}
Number of nums: {{ num_list|length }}
{% else %}
No num.
{% endif %}
注释注释的写法如下:{# greeting #}hello,这个注释只能注释一行。无法注释多行
模板继承
这一部分是模板里面最强大的部分,非常的有意思,如果这个你不懂的话,那就不能说你知道django里的模板了。其实说模板继承这种概念是把继承这个东西给泛化了,不再那么局限于语言。这里的继承实际上就是简单的在原来一个基框架上增加东西,也可以覆盖基框架的一些东西。在Django的官网上有一个不错的例子,我在这里也举出来:
<!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标签定义了3个块,那么这些块可以被子母版填充.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这个标签了,这个标签就是告诉模板引擎这个模板继承自另一个模板,也就说block标签告诉一个模板:你要被继承。extends告诉一个标签:你要继承别人。
一般情况下的模板继承使用技巧是:
- 创建一个base.html,实现一个大的框架
- 创建一个base_sectionname.html,也就是说分别实现各个区的框架
- 创建具体的section模板,也就说具体实现每个区。
你可以看到Django的每一处的设计都体现出了DRY的原则,使用起来非常的方便,我发现我越来越喜欢这个东西了。
block和extends
使用方法已经如上所述了,主要是为了实现模板继承用的.
关于模板这个东西,先写些吧,主要还是需要去官网上查各种用法,还蛮有意思的,使用方便,容易理解,比较简单。