zoukankan      html  css  js  c++  java
  • django的模板(二)

    模板(二)

    实验简介

    本节继续介绍模板的常用标签,for、if、ifequal和注释标签。

    一、基本的模板标签和过滤器

    1. 标签

    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 的“真值”

    在Python和Django模板系统中,以下这些对象相当于布尔值的False

    空列表 —— []

    空元组 —— ()

    空字典 —— {}

    空字符串 —— '' or ""

    零值 —— 0

    特殊对象 —— None

    对象False —— 很明显

    提示:你也可以在自定义的对象里定义他们的布尔值属性(这个是python的高级用法)。

    除以上几点以外的所有东西都视为True

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

    {% if athlete_list and coach_list %}
        Both athletes and coaches are available.
    {% endif %}
    
    {% if not athlete_list %}
        There are no athletes.
    {% endif %}
    
    {% if athlete_list or coach_list %}
        There are some athletes or 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 %}
    

    {% if %} 标签不允许在同一个标签中同时使用 and 和 or ,因为逻辑上可能模糊的,例如,如下示例是错误的, 这样的代码是不合法的:

    {% if athlete_list and coach_list or cheerleader_list %}
    

    系统不支持用圆括号来组合比较操作。 如果你确实需要用到圆括号来组合表达你的逻辑式,考虑将它移到模板之外处理,然后以模板变量的形式传入结果吧。 或者,仅仅用嵌套的{% if %}标签替换吧,就像这样:

    {% if athlete_list %}
        {% if coach_list or cheerleader_list %}
            We have athletes, and either coaches or cheerleaders!
        {% endif %}
    {% endif %}
    

    多次使用同一个逻辑操作符是没有问题的,但是我们不能把不同的操作符组合起来。 例如,这是合法的:

    {% if athlete_list or coach_list or parent_list or teacher_list %}
    

    并没有 {% elif %} 标签, 请使用嵌套的{% if %} 标签来达成同样的效果:

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

    一定要用 {% endif %} 关闭每一个 {% if %} 标签。

    for

    {% 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>
    

    给标签增加一个 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_list为空的话,会执行{% 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类似于forloop.counter,但是它是从0计数的。 第一次执行循环时这个变量会被设置为0。

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

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

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

    {% 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
    

    另一个常见的用途是为列表的每个单词的加上逗号。

    {% 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/ifnotequal

    Django模板系统压根儿就没想过实现一个全功能的编程语言,所以它不允许我们在模板中执行Python的语句(还是那句话,要了解更多请参看理念和限制小节)。 但是比较两个变量的值并且显示一些结果实在是个太常见的需求了,所以Django提供了 {% ifequal %} 标签供我们使用。

    {% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值。

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

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

    参数可以是硬编码的字符串,随便用单引号或者双引号引起来,所以下列代码都是正确的:

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

    这是ifnotequal的例子:

    {% ifnotequal section "community" %}
        <h1>Community</h1>
    {% endifnotequal %}
    

    和 {% 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 %} 中。 下面是些错误的例子:

    # So terrible!
    {% 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 not
    a comment #}
    test.
    

    如果要实现多行注释,可以使用{% comment %} 模板标签,就像这样:

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

    过滤器

    就象本章前面提到的一样,模板过滤器是在变量被显示前修改它的值的一个简单方法。 过滤器使用管道字符,如下所示:

    {{ name|lower }}
    

    显示的内容是变量 {{ name }} 被过滤器 lower 处理后的结果,它功能是转换文本为小写。

    过滤管道可以被套接 ,就是说,一个过滤器管道的输出又可以作为下一个管道的输入,如此下去。 下面的例子实现查找列表的第一个元素并将其转化为大写。

    {{ my_list|first|upper }}
    

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

    {{ bio|truncatewords:"30" }}
    

    这个将显示变量 bio 的前30个词。

    以下几个是最为重要的过滤器的一部分。

    addslashes : 添加反斜杠到任何反斜杠、单引号或者双引号前面。 这在处理包含JavaScript的文本时是非常有用的。

    date : 按指定的格式字符串参数格式化 date 或者 datetime 对象, 范例:

    {{ pub_date|date:"F j, Y" }}
    

    length : 返回变量的长度。 对于列表,这个参数将返回列表元素的个数。 对于字符串,这个参数将返回字符串中字符的个数。 你可以对列表或者字符串,或者任何知道怎么测定长度的Python 对象使用这个方法(也就是说,有 __len__() 方法的对象)。

    更多的过滤器,官方文档(英文)

    二、小结

    本节讲了模板的常用标签,for、if、ifequal和注释标签。

    Django的模板内容实在是比较多,到此也只是讲了一些基本的使用而已,我们将提供更多的扩展阅读,当你决定使用django开发网站时,你一定用的到:django book自带的模板拓展阅读(未翻译)

    django官方文档--模板(英文)

    下一节,我们会在视图(views.py)中使用模板,完成一个“动态的”web页面

    作业

    请实现一个模板,输入一个文章列表,模板能够循环显示列表的内容。

  • 相关阅读:
    apache安全—用户访问控制
    hdu 3232 Crossing Rivers 过河(数学期望)
    HDU 5418 Victor and World (可重复走的TSP问题,状压dp)
    UVA 11020 Efficient Solutions (BST,Splay树)
    UVA 11922 Permutation Transformer (Splay树)
    HYSBZ 1208 宠物收养所 (Splay树)
    HYSBZ 1503 郁闷的出纳员 (Splay树)
    HDU 5416 CRB and Tree (技巧)
    HDU 5414 CRB and String (字符串,模拟)
    HDU 5410 CRB and His Birthday (01背包,完全背包,混合)
  • 原文地址:https://www.cnblogs.com/mrchige/p/6398275.html
Copyright © 2011-2022 走看看