Django学习笔记-标签

Django学习笔记-标签

模板系统带有内置的标签和过滤器,下面提供了一个多数通用标签和过滤器的简要说明:

标签if/else

if/else
{% if %}标签检查(evaluate)一个变量,如果这个变量为真(即,变量存在,非空,不是布尔值假),系统会显示在{% if %}和{% endif %}之间的任何内容,例如:

{% if today_is_weekend %}
    <p>Welcome to the weekend!</p>
{% endif %}

{% else %}标签是可选的:

{% if today_is_weekend %}
    <p>Welcome to the weekend!</p>
{% else %}
    <p>Get back to work.</p>
{% endif %}

在Python和Django模板系统中,以下对象的相当于布尔值为False:
空列表([])
空元组(())
空字典({})
空字符串(”)
零值(0)
特殊对象(None)
对象Fasle(很明显)
也可以在自定义的对象里定义他们的布尔值属性(这个是python的高级用法)。
除上述以外,其余均为True。

{% if %}标签接受and、or或者not关键字来对多个变量做判断,或者对变量取反(not),eg:

{% if athlete_list and coach_list %}
    Both athletes and coaches are available.
{% endif %}

{% if not athlete_list %}
    There are not athletes.
{% endif %}

{% if athlete_list or coach_list %}
    There are no athletes or there are some coaches.
{% endif %}

{% if not athlete_list or coach_list %}
    There are no athletes or there are some coaches.
{% endif %}

{% if athlete_list and not coach_list %}
    There are some athletes and absolutely no coaches.
{% endif %}

注意:
1. if标签不允许在同一个标签内同时使用and和or,因为逻辑上会模糊。
2. 系统不支持用圆括号来组合比较操作,如果需要组合比较,可以考虑将它移到模板之外处理,然后以模板变量的形式传入结果,或者用嵌套的{% if %}标签替换,eg:

{% if athlete_list %}
     {% if coach_list or cheerleader_list %}
          We have athletes, and either coaches or cheerleaders!
     {% endif %}
{% endif %}
  1. 多次使用同一个逻辑操作符是没有问题的,但是不能把不同的操作符组合起来,eg:
{% if athlete_list or coach_list or parent_list or teacher_list %}
  1. if标签里并没有{% elif %}标签,都是使用嵌套的{% if %}标签来达成同样的效果,eg:
{% if athlete_list %}
     <p>Here are the athletes: {{ athlete_list }}.</p>
{% else %}
     <p>No athletes are available.</p>
     {% if coach_list %}
          <p>Here are the coaches: {{ coach_list }}.</p>
     {% endif %}
{% endif %}
  1. 一定记住要是有{% endif %}标签来关闭每一个{% if %}标签。

标签for

for
{% for %} 允许我们在一个序列上迭代。 与Python的 for 语句的情形类似,循环语法是 for X in Y ,Y是要迭代的序列而X是在每一个特定的循环中使用的变量名称。 每一次循环中,模板系统会渲染在 {% for %} 和{% endfor %} 之间的所有内容。eg:
给定一个运动员列表athlete_list变量

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}
</ul>

给标准增加一个reversed使得该列表被反向迭代:

{% for athlete in athlete_list reversed %}
...
{% endfor %}

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

{% for athlete in athlete_list %}
    <h1>{{ athlete.name }}</h1>
    <ul>
    {% for sport in athlete.sports_played %}
        <li>{{ sport }}</li>
    {% endfor %}
    </ul>
{% endfor %}

在执行循环之前先检测列表的大小是一个通常的做法,当列表为空时输出一些特别的提示:

{% if athlete_list %}
    {% for athlete in athlete_list %}
        <p>{{ athlete.name }}</p>
    {% endfor %}
{% else %}
    <p>There are no athletes. Only computer programmers.</p>
{% endif %}

for标签支持一个可选的”{% empty %}”分句,通过它我们可以定义当列表为空时的输出内容,下面的例子等价于上一个:

{% for athlete in athlete_list %}
    <p>{{ athlete.name }}</p>
{% empty %}
    <p>There are no athletes. Only computer programmers.</p>
{% endfor %}

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

在每个”{% for %}”循环里有一个称为”forloop”的模板变量。这个变量的作用是提示循环进度信息的属性。

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

{% for item in todo_list %}
    <p>{{ forloop.counter }}: {{ item }}</p>
{% endfor %}

forloop.counter0这个计数器是从0开始的,第一次执行循环时这个变量会被设置为0。
forloop.revcounter是表示循环中剩余项的整型变量,第一次执行循环时这个变量会被设置为序列中项的总和,最后一次循环执行中,这个变量将被置为1。
forloop.revcounter0 类似于 forloop.revcounter ,但它以0做为结束索引。在第一次执行循环时,该变量会被置为序列的项的个数减1。
forloop.first 是一个布尔值,如果该迭代是第一次执行,那么它被置为True。
forloop.last 是一个布尔值,在最后一次执行循环时被置为True。
forloop.parentloop 是一个指向当前循环的上一级循环的forloop 对象的引用(在嵌套循环的情况下)。

forloop 变量仅仅能够在循环中使用。 在模板解析器碰到{% endfor %}标签后,forloop就不可访问了。

标签ifequal/ifnotequal

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 %}。

注释#

Django模板语言也使用{##}来提供代码注释。
{# 单行注释 #}
{% comment %}
多行
注释
{% endcomment %}

过滤器

模板过滤器是在变量被现实前修改它的值得一个简单方法,过滤器使用管道字符,如下所示:
{{ name | lower }}
显示的内容是变量{{ name }}被过滤器lower处理后的结果,它的功能是转换文本为小写。
过滤管道可以被*套接*,也就是说,一个过滤器管道的输出又可以作为下一个管道的输入,eg:

{# 实现查找列表的第一个元素并将其转化为大写 #}
{{ my_list | first | upper }}

有些过滤器有参数,过滤器的参数跟随冒号之后并且总是以双引号包含:

{# 显示变量bio的前30个词 #}
{{ bio | truncatewords:"30" }}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值