当前位置:K88软件开发文章中心网站服务器框架django → 文章内容

Django 模版进阶

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-25 14:19:14

dif %}{{ object }}</li>{% endfor %}r %}forloop.last 是一个布尔值;在最后一次执行循环时被置为True。 一个常见的用法是在一系列的链接之间放置管道符(|){% for link in links %}{{ link }}{% if not forloop.last %} | {% endif %}{% endfor %}上面的模板可能会产生如下的结果:Link1 | Link2 | Link3 | Link4另一个常见的用途是为列表的每个单词的加上逗号。Favorite places:{% for p in places %}{{ p }}{% if not forloop.last %}, {% endif %}{% endfor %}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就不可访问了。Context和forloop变量在一个 {% for %} 块中,已存在的变量会被移除,以避免 forloop 变量被覆盖。 Django会把这个变量移动到forloop.parentloop 中。通常我们不用担心这个问题,但是一旦我们在模板中定义了 forloop 这个变量(当然我们反对这样做),在 {% for %} 块中它会在 forloop.parentloop 被重新命名。ifequal/ifnotequalDjango模板系统压根儿就没想过实现一个全功能的编程语言,所以它不允许我们在模板中执行Python的语句(还是那句话,要了解更多请参看理念和限制小节)。 但是比较两个变量的值并且显示一些结果实在是个太常见的需求了,所以Django提供了 {% ifequal %} 标签供我们使用。{% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值。下面的例子比较两个模板变量 user 和 currentuser :{% ifequal user currentuser %} <h1>Welcome!</h1>{% endifequal %}参数可以是硬编码的字符串,随便用单引号或者双引号引起来,所以下列代码都是正确的:{% ifequal section 'sitenews' %} <h1>Site News</h1>{% endifequal %}{% ifequal section "community" %} <h1>Community</h1>{% endifequal %}和 {% if %} 类似, {% ifequal %} 支持可选的 {% else%} 标签:{% ifequal section 'sitenews' %} <h1>Site News</h1>{% else %} <h1>No News Here</h1>{% endifequal %}只有模板变量,字符串,整数和小数可以作为 {% ifequal %} 标签的参数。下面是合法参数的例子:{% ifequal variable 1 %}{% ifequal variable 1.23 %}{% ifequal variable 'foo' %}{% ifequal variable "foo" %}其他任何类型,例如Python的字典类型、列表类型、布尔类型,不能用在 {% ifequal %} 中。 下面是些错误的例子:{% ifequal variable True %}{% ifequal variable [1, 2, 3] %}{% ifequal variable {'key': 'value'} %}如果你需要判断变量是真还是假,请使用 {% if %} 来替代 {% ifequal %} 。注释就像HTML或者Python,Django模板语言同样提供代码注释。 注释使用 {# #} :{# This is a comment #}注释的内容不会在模板渲染时输出。用这种语法的注释不能跨越多行。 这个限制是为了提高模板解析的性能。 在下面这个模板中,输出结果和模板本身是 完全一样的(也就是说,注释标签并没有被解析为注释):This is a {# this is nota comment #}test.如果要实现多行注释,可以使用{% comment %} 模板标签,就像这样:{% comment %}This is amulti-line comment.{% endcomment %}过滤器就象本章前面提到的一样,模板过滤器是在变量被显示前修改它的值的一个简单方法。 过滤器使用管道字符,如下所示:{{ name|lower }}显示的内容是变量 {{ name }} 被过滤器 lower 处理后的结果,它功能是转换文本为小写。过滤管道可以被 套接 ,既是说,一个过滤器管道的输出又可以作为下一个管道的输入,如此下去。 下面的例子实现查找列表的第一个元素并将其转化为大写。{{ my_list|first|upper }}有些过滤器有参数。 过滤器的参数跟随冒号之后并且总是以双引号包含。 例如:{{ bio|truncatewords:"30" }}这个将显示变量 bio 的前30个词。以下几个是最为重要的过滤器的一部分。 附录F包含其余的过滤器。addslashes : 添加反斜杠到任何反斜杠、单引号或者双引号前面。 这在处理包含JavaScript的文本时是非常有用的。date : 按指定的格式字符串参数格式化 date 或者 datetime 对象, 范例:{{ pub_date|date:"F j, Y" }}格式参数的定义在附录F中。length : 返回变量的长度。 对于列表,这个参数将返回列表元素的个数。 对于字符串,这个参数将返回字符串中字符的个数。 你可以对列表或者字符串,或者任何知道怎么测定长度的Python 对象使用这个方法(也就是说,有 len() 方法的对象)。理念与局限现在你已经对Django的模板语言有一些认识了,我们将指出一些特意设置的限制和为什么要这样做 背后的一些设计哲学。相对与其他的网络应用的组件,模板的语法很具主观性,因此可供程序员的选择方案也很广泛。 事实上,Python有成十上百的 开放源码的模板语言实现。 每个实现都是因为开发者认为现存的模板语言不够用。 (事实上,对一个 Python开发者来说,写一个自己的模板语言就象是某种“成人礼”一样! 如果你还没有完成一个自己的 模板语言,好好考虑写一个,这是一个非常有趣的锻炼。 )明白了这个,你也许有兴趣知道事实上Django并不强制要求你必须使用它的模板语言。 因为Django 虽然被设计成一个FULL-Stack的Web框架,它提供了开发者所必需的所有组件,而且在大多数情况 使用Django模板系统会比其他的Python模板库要 更方便 一点,但是并不是严格要求你必须使用 它。 你将在后续的“视图中应用模板”这一章节中看到,你还可以非常容易地在Django中使用其他的模板语言。虽然如此,很明显,我们对Django模板语言的工作方式有着强烈的偏爱。 这个模板语言来源于World Online的开发经验和Django创造者们集体智慧的结晶。 下面是关于它的一些设计哲学理念:业务逻辑应该和表现逻辑相对分开 。我们将模板系统视为控制表现及表现相关逻辑的工具,仅此而已。 模板系统不应提供超出此基本目标的功能。出于这个原因,在 Django 模板中是不可能直接

上一页  [1] [2] [3] [4] [5] [6] [7]  下一页


Django 模版进阶