首页 > 代码库 > Djanjo中级篇之模板语言

Djanjo中级篇之模板语言

模板

一、引用变量

模版的创建过程,对于模版,其实就是读取模版(其中嵌套着模版标签),然后将 Model 中获取的数据插入到模版中,最后将信息返回给用户。

{{ xxx }}

二、标签

用{%  %}表示,用于处理一些逻辑

常用的几个标签{% if 条件 %}    内容{% endif %}{% for  xxx  in  条件 %}    {{xxx}}{% endfor %}    

1、for标签

1>每一次循环中,模板系统会渲染在 {% for %} 和 {% endfor %} 之间的所有内容

2> 给标签增加一个 reversed 使得该列表被反向迭代

{% for athlete in athlete_list reversed %}

3>可以嵌套使用 {% for %} 标签

4> Django不支持退出循环操作。 如果我们想退出循环,可以改变正在迭代的变量,让其仅仅包含需要迭代的项目。 同理,Django也不支持continue语句,我们无法让当前迭代操作跳回到循环头部。

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

富有魔力的forloop变量只能在循环中得到,当模板解析器到达{% endfor %}时forloop就消失了

forloop.counter 总是一个表示当前循环的执行次数的整数计数器forloop.counter0 类似于forloop.counter ,但是它是从0计数的forloop.first是一个布尔值;在第一次执行循环时被置为Trueforloop.last 是一个布尔值;在最后一次执行循环时被置为True

2、if标签

1>{% if %}标签计算一个变量值,如果是“true”,即它存在、不为空并且不是false的boolean值 系统则会显示{% if %}和{% endif %}间的所有内容

2>没有{% elif %}标签,使用嵌套的{% if %}标签可以做到同样的事情

3>{% if %}标签接受and,or或者not来测试多个变量值或者否定一个给定的变量

4>{% if %}标签不允许同一标签里同时出现and和or,否则逻辑容易产生歧义

5>如果你想结合and和or来做高级逻辑,只需使用嵌套的{% if %}标签即可

6>多次使用同一个逻辑符号是合法的

三、模板继承

模板可以用继承的方式来实现复用。在整个网站中,减少共用页面区域(比如站点导航)所引起的重复和冗余代码

本质上来说,模板继承就是先构造一个基础框架模板,而后在其子模板中对它所包含站点公用部分和定义块进行重载,第一步是定义 基础模板 , 该框架之后将由子模板所继承

母版:

<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>{% block title %}久久寻网{% endblock %}</title><link type="text/css" rel="stylesheet" href="http://www.mamicode.com/style.css" /></head><body>    <div id="side">        {% block side %}        <ul>            <li><a href="http://www.mamicode.com/index.html">主页</a></li>            <li><a href="http://www.mamicode.com/blog/index.html">博客</a></li>        </ul>        {% endblock %}    </div>    <div id="content">        {% block content %}{% endblock %}    </div></body></html>

我们称它为 base.html, 定义了一些简单的 HTML 骨架文档, 你可以把它用到一些简单两列的网页上. “子” 模板的任务就是用内容填写这些空白的内容块

子版:

{% extends "text.html" %}{% block title %}修改标题{% endblock %}{% block side %}    <ul>        <li><a href="http://www.mamicode.com/index.html">修改后主页</a></li>        <li><a href="http://www.mamicode.com/blog/index.html">修改后博客</a></li>    </ul>{% endblock %}{% block content %}    <h1>新增加内容</h1>    {% endblock %}

1>{% extends "text.html" %}表示导入母版

2> 每个{% block %}标签所要做的是告诉模板引擎,该模板下的这一块内容将有可能被子模板覆盖,而不一定一定要覆盖掉母版中的内容

四、注释标签

1. Django单行注释使用 {# 这是一个注释 #}

用这种语法的注释不能跨越多行, 这个限制是为了提高模板解析的性能。 在下面这个模板中,输出结果和模板本身是 完全一样的(也就是说,注释标签并没有被解析为注释):

This is a {# this is nota comment #}test.

2. 实现多行注释,可以使用`` {% comment %}`` 模板标签

{% comment %}This is amulti-line comment.{% endcomment %}

五、过滤器

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

{{ name|lower }}

2>过滤管道可以被* 套接* ,既是说,一个过滤器管道的输出又可以作为下一个管道的输入:

{{ my_list|first|upper }}

六、ifequal/ifnotequal 标签

1. {% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值下面的例子比较两个模板变量 user 和 currentuser :

{% ifequal user currentuser %}    <h1>Welcome!</h1>{% endifequal %}

 

Djanjo中级篇之模板语言