Django模板经常使用语法规则

 

Django 模板标签html

if/else 标签 for 标签 ifequal/ifnotequal 标签
注释标签 过滤器 include 标签
URL标签 模板继承  

 

if/else 标签django

1. 基本语法格式以下:
  {% if condition %}
  ... display
  {% endif %}
或者:服务器

  {% if condition1 %}
  ... display 1
  {% elif condiiton2 %}
  ... display 2
  {% else %}
  ... display 3
  {% endif %}
根据条件判断是否输出。if/else 支持嵌套。app

Note:模板标签中的变量是不用{{}}包含的。框架

2. {% if %} 标签接受 and , or 或者 not 关键字来对多个变量作判断 ,或者对变量取反( not ),例如:oop

  {% if athlete_list and coach_list %}
    athletes 和 coaches 变量都是可用的。
  {% endif %}
Note:性能

1. {% if %} 标签不容许在同一个标签中同时使用 and 和 or ,由于逻辑上可能模糊的,这样的代码是不合法的:网站

  {% if athlete_list and coach_list or cheerleader_list %}
2. 系统不支持用圆括号来组合比较操做。 若是你确实须要用到圆括号来组合表达你的逻辑式,考虑将它移到模板以外处理,而后以模板变量的形式传入结果吧。 或者,仅仅用嵌套的{%if%}标签替换ui

TOP
for 标签this

1. {% for %} 容许咱们在一个序列上迭代。与Python的 for 语句的情形相似,循环语法是 for X in Y ,Y是要迭代的序列而X是在每个特定的循环中使用的变量名称。

每一次循环中,模板系统会渲染在 {% for %} 和 {% endfor %} 之间的全部内容。

例如,给定一个运动员列表 athlete_list 变量,咱们可使用下面的代码来显示这个列表:
  <ul>
  {% for athlete in athlete_list %}
  <li>{{ athlete.name }}</li>
  {% endfor %}
  </ul>
2. 给标签增长一个 reversed 使得该列表被反向迭代:

  {% for athlete in athlete_list reversed %}
3. 能够嵌套使用 {% for %} 标签。

在执行循环以前先检测列表的大小是一个一般的作法,当列表为空时输出一些特别的提示。`` for`` 标签支持一个可选的`` {% empty %}`` 分句,经过它咱们能够定义当列表为空时的输出内容 下面的例子与用if-else实现等价:

  {% for athlete in athlete_list %}
    <p>{{ athlete.name }}</p>
    {% empty %}
    <p>There are no athletes. Only computer programmers.</p>
  {% endfor %}
4. Django不支持退出循环操做。 若是咱们想退出循环,能够改变正在迭代的变量,让其仅仅包含须要迭代的项目。 同理,Django也不支持continue语句,咱们没法让当前迭代操做跳回到循环头部。

5.在每一个`` {% for %}``循环里有一个称为`` forloop`` 的模板变量。这个变量有一些提示循环进度信息的属性。

forloop.counter 老是一个表示当前循环的执行次数的整数计数器。 这个计数器是从1开始的,因此在第一次循环时forloop.counter 将会被设置为1。

  {% for item in todo_list %}
    <p>{{ forloop.counter }}: {{ item }}</p>
  {% endfor %}
forloop.counter0 相似于forloop.counter ,可是它是从0计数的。 第一次执行循环时这个变量会被设置为0。

forloop.revcounter 是表示循环中剩余项的整型变量。 在循环初次执行时forloop.revcounter 将被设置为序列中项的总数。 最后一次循环执行中,这个变量将被置1。

forloop.revcounter0 相似于forloop.revcounter ,但它以0作为结束索引。在第一次执行循环时,该变量会被置为序列的项的个数减1。

forloop.first 是一个布尔值,若是该迭代是第一次执行,那么它被置为```` 在下面的情形中这个变量是颇有用的:

System Message: WARNING/2 (<string>, line 1071);backlink

Inline literal start-string without end-string.

  {% for object in objects %}
    {% if forloop.first %}<li class="first">{% else %}<li>{% endif %}
    {{ object }}
  </li>
  {% endfor %}
forloop.last 是一个布尔值;在最后一次执行循环时被置为True。 一个常见的用法是在一系列的连接之间放置管道符(|),另外一个常见的用途是为列表的每一个单词的加上逗号。

  {% for link in links %}{{ link }}{% if not forloop.last %} | {% endif %}{% endfor %}
上面的模板可能会产生以下的结果:

Link1 | Link2 | Link3 | Link4
forloop.parentloop 是一个指向当前循环的上一级循环的forloop 对象的引用(在嵌套循环的状况下)。
  {% for country in countries %}
  <table>
  {% for city in country.city_list %}
    <tr>
    <td>Country #{{ forloop.parentloop.counter }}</td>
    <td>City #{{ forloop.counter }}</td>
    <td>{{ city }}</td>
    </tr>
    {% endfor %}
    </table>
  {% endfor %}
forloop 变量仅仅可以在循环中使用。 在模板解析器碰到{%endfor%}标签后,forloop就不可访问了。

6. Context和forloop变量

在一个 {% for%} 块中,已存在的变量会被移除,以免forloop 变量被覆盖。 Django会把这个变量移动到forloop.parentloop 中。一般咱们不用担忧这个问题,可是一旦咱们在模板中定义了forloop 这个变量(固然咱们反对这样作),在{%for%} 块中它会在forloop.parentloop 被从新命名。

TOP

ifequal/ifnotequal 标签
1. {% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中全部的值。

下面的例子比较两个模板变量 user 和 currentuser :

  {% ifequal user currentuser %}
    <h1>Welcome!</h1>
  {% endifequal %}
Note:只有模板变量,字符串,整数和小数能够做为 {% ifequal %} 标签的参数。其余任何类型,例如Python的字典类型、列表类型、布尔类型,不能用在{%ifequal%} 中。

2. {% ifequal %} 支持可选的 {% else%} 标签:8

  {% ifequal section 'sitenews' %}
    <h1>Site News</h1>
  {% else %}
    <h1>No News Here</h1>
  {% endifequal %}

TOP

注释标签
1. Django单行注释使用 {# #}。

{# 这是一个注释 #}
用这种语法的注释不能跨越多行。 这个限制是为了提升模板解析的性能。 在下面这个模板中,输出结果和模板自己是 彻底同样的(也就是说,注释标签并无被解析为注释):

  This is a {# this is not
  a comment #}
  test.
2. 实现多行注释,可使用`` {% comment %}`` 模板标签

  {% comment %}
  This is a
  multi-line comment.
  {% endcomment %}

TOP

过滤器
1. 模板过滤器能够在变量被显示前修改它,过滤器使用管道字符,以下所示:

  {{ name|lower }}
{{ name }} 变量被过滤器 lower 处理后,文档大写转换文本为小写。

2. 过滤管道能够被* 套接* ,既是说,一个过滤器管道的输出又能够做为下一个管道的输入:

  {{ my_list|first|upper }}
以上实例将第一个元素并将其转化为大写。

Note:另外一种实现

  {{ django|title }}
3. 有些过滤器有参数。 过滤器的参数跟随冒号以后而且老是以双引号包含。 例如:
  {{ bio|truncatewords:"30" }}
这个将显示变量 bio 的前30个词。

4.linebreaks

  Replaces line breaks in plain text with appropriate HTML; a singlenewline becomes an HTML line break (<br/>) and a new linefollowed by a blank line becomes a paragraph break (</p>).

For example:

  {{ value|linebreaks }}
  If value is Joel\nis a slug, the output will be<p>Joel<br/>is aslug</p>.

linebreaksbr

Converts all newlines in a piece of plain text to HTML line breaks(<br/>).

For example:

  {{ value|linebreaksbr }}
  If value is Joel\nis a slug, the output will beJoel<br/>isaslug.

5. 其余过滤器:
addslashes : 添加反斜杠到任何反斜杠、单引号或者双引号前面。
date : 按指定的格式字符串参数格式化 date 或者 datetime 对象,实例:
{{ pub_date|date:"F j, Y" }} #将变量ship_date传递给date过滤器,同时指定参数”F j,Y”。date过滤器根据参数进行格式输出。如时间的显示 April 2, 2009 是按 'F j, Y' 格式显示的。
length : 返回变量的长度。你能够对列表或者字符串,或者任何知道怎么测定长度的Python 对象使用这个方法(也就是说,有 __len__() 方法的对象)。
Note:过滤器是用管道符(|)来调用的,具体能够参见Unix管道符。

[Built-in filter reference]

[Writing custom template filters]

TOP

include 标签
该标签容许在(模板中)包含其它的模板的内容。 标签的参数是所要包含的模板名称,能够是一个变量,也能够是用单/双引号硬编码的字符串。 每当在多个模板中出现相同的代码时,就应该考虑是否要使用{%include%} 来减小重复。
下面这两个例子都包含了 nav.html 模板:

  {% include "nav.html" %}
Note:

1. 和在 get_template() 中同样, 对模板的文件名进行判断时会在所调取的模板名称以前加上来自TEMPLATE_DIRS 的模板目录。

2.若是{%include%}标签指定的模板没找到,Django将会在下面两个处理方法中选择一个:

若是 DEBUG 设置为 True ,你将会在 Django 错误信息页面看到TemplateDoesNotExist 异常。

若是 DEBUG 设置为 False ,该标签不会引起错误信息,在标签位置不显示任何东西。

 TOP

URL标签

url的用法也很简单,只要在urlpatterns里使用它,附加一个name,如:

  url(r'^article$','news_index' ,name="news_index"),
Templates里 这样使用
  {%url 'name'%}
地址连接就能使用了。
Note:name是全局的,你整个urlpatterns里只能一个惟一的name,这个道理应该好理解,就像网站的地址也是惟一性的。

views里怎么用以及urlpatterns的地址包含有参数的时候<a href="{%url 'news_archive' 2010 02%}">2010年02月</a>时可参考[Django url 标签的使用]

 TOP

模板继承

模板能够用继承的方式来实现复用。在整个网站中,如何减小共用页面区域(好比站点导航)所引发的重复和冗余代码?

解决该问题的传统作法是使用 服务器端的 includes ,你能够在 HTML 页面中使用该指令将一个网页嵌入到另外一个中。 事实上, Django 经过刚才讲述的 {% include %} 支持了这种方法。 可是用 Django 解决此类问题的首选方法是使用更加优雅的策略—— 模板继承 。本质上来讲,模板继承就是先构造一个基础框架模板,然后在其子模板中对它所包含站点公用部分和定义块进行重载。你能够将其视为服务器端 include 的逆向思惟版本。 你能够对那些 不一样 的代码段进行定义,而不是 共同 代码段。

第一步是定义 基础模板 , 该框架以后将由 子模板 所继承。 基础模板:

  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
  <html lang="en">
  <head>
  <title>{% block title %}{% endblock %}</title>
  </head>
  <body>
  <h1>My helpful timestamp site</h1>
  {% block content %}{% endblock %}
  {% block footer %}
    <hr>
    <p>Thanks for visiting my site.</p>
  {% endblock %}
  </body>
  </html>
Note:
1. 全部的 {% block %} 标签告诉模板引擎,子模板能够重载这些部分。每一个{%block%}标签所要作的是告诉模板引擎,该模板下的这一块内容将有可能被子模板覆盖。

2.注意因为子模板并无定义 footer 块,模板系统将使用在父模板中定义的值。 父模板{%block%} 标签中的内容老是被看成一条退路。

3. 继承并不会影响到模板的上下文。 换句话说,任何处在继承树上的模板均可以访问到你传到模板中的每个模板变量。

4. 你能够根据须要使用任意多的继承次数。

使用继承的一种常见方式是下面的三层法:

建立 base.html 模板,在其中定义站点的主要外观感觉。 这些都是不常修改甚至从不修改的部分。

为网站的每一个区域建立 base_SECTION.html 模板(例如,base_photos.html 和base_forum.html )。这些模板对base.html 进行拓展,并包含区域特定的风格与设计。

为每种类型的页面建立独立的模板,例如论坛页面或者图片库。 这些模板拓展相应的区域模板。

使用模板继承的一些诀窍:

若是在模板中使用 {%extends%} ,必须保证其为模板中的第一个模板标记。 不然,模板继承将不起做用。

通常来讲,基础模板中的 {%block%} 标签越多越好。记住,子模板没必要定义父模板中全部的代码块,所以你能够用合理的缺省值对一些代码块进行填充,而后只对子模板所需的代码块进行(重)定义。 俗话说,钩子越多越好。

若是发觉本身在多个模板之间拷贝代码,你应该考虑将该代码段放置到父模板的某个 {% block %} 中。

若是你须要访问父模板中的块的内容,使用 {{block.super}}这个标签吧,这一个魔法变量将会表现出父模板中的内容。 若是只想在上级代码块基础上添加内容,而不是所有重载,该变量就显得很是有用了。

不容许在同一个模板中定义多个同名的 {%block%} 。 存在这样的限制是由于block 标签的工做方式是双向的。 也就是说,block 标签不只挖了一个要填的坑,也定义了在父模板中这个坑所填充的内容。若是模板中出现了两个相同名称的{% block %} 标签,父模板将无从得知要使用哪一个块的内容。

{%extends%} 对所传入模板名称使用的加载方法和get_template() 相同。 也就是说,会将模板名称被添加到TEMPLATE_DIRS 设置以后。

多数状况下, {%extends%} 的参数应该是字符串,可是若是直到运行时方能肯定父模板名,这个参数也能够是个变量。 这使得你可以实现一些很酷的动态功能。

TOP

相关文章
相关标签/搜索