zoukankan      html  css  js  c++  java
  • 测试开发之Django——No6.Django模板中的标签语言

    模板中的标签语言

    1.if/else

    {% if  %} 标签检查(evaluate)一个变量,如果这个变量为真(即:变量存在,非空,不是布尔值假),系统会显示在{% if  %} 和

    {% endif %}直接的任何内容。

    例如:

    {% if a %}

      <p>Welcome to the weekend!</p>

    {% endif %}

    {% else %} 和 {% elif %} 标签是可选的

    当然,是在根据需要来决定是否需要使用这个标签

    2.布尔运算符

    if标签可以使用andornot测试多个变量或否定给定变量:

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

    允许在同一标记内使用both andor子句, and优先级高于or例如:

    {% if athlete_list and coach_list or cheerleader_list %}

    将被解释为:

    if (athlete_list and coach_list) or cheerleader_list
    

    if标记中使用实际括号是无效的语法。如果需要它们来指示优先级,则应使用嵌套if标记。

    if标签也可以使用运营商==!=<>, <=>=in,和它的工作如下:not inisis not

    == 运算符:等于

    != 运算符:不等于

    >  运算符:大于

    <   运算符:小于

    <= 运算符:小于等于

    >= 运算符:大于等于

    in  运算符:包含在内

    not in 运算符:不包含

    is 运算符:对象身份的判断,测试两个只是否是同一个对象

    not is 运算符:测试两个是是否不是同一个对象

    表达式的运算符优先规则(优先级从低到高):

    or and not in == != < > <= >=

    模板系统中,只有下面几种情况的布尔值是False:

    1)空列表

    2)空元组

    3)空字符串

    4)零值

    5)特殊对象none

    6)对象false

    3.for 

    循环遍历数组中的每个项目,使项目在上下文变量中可用。例如,要显示以下提供的运动员列表 athlete_list

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

    您可以使用反向循环遍历列表 {% for obj in list reversed %}

    如果需要循环列表列表,可以将每个子列表中的值解压缩为单个变量。例如,如果您的上下文包含调用的(x,y)坐标列表points,则可以使用以下内容输出点列表:

     
    {% for x, y in points %}
        There is a point at {{ x }},{{ y }}
    {% endfor %}
    

      

    for循环设置循环中可用的许多变量:

    变量描述
    forloop.counter 循环的当前迭代(1索引)
    forloop.counter0 循环的当前迭代(0索引)
    forloop.revcounter 循环结束时的迭代次数(1索引)
    forloop.revcounter0 循环结束时的迭代次数(0索引)
    forloop.first 如果这是第一次通过循环,则为真
    forloop.last 如果这是最后一次循环,则为真
    forloop.parentloop 对于嵌套循环,这是围绕当前循环的循环

    for标签可以使用一个可选条款,其文本显示,如果给定的数组为空或无法找到:{% empty %}

    <ul>
    {% for athlete in athlete_list %}
        <li>{{ athlete.name }}</li>
    {% empty %}
        <li>Sorry, no athletes in this list.</li>
    {% endfor %}
    </ul>
    

      

    autoescape

    控制当前的自动转义行为。此标记采用on或 off作为参数,并确定自动转义是否在块内生效。该块以endautoescape结束标记关闭

    当自动转义生效时,所有变量内容都会在将结果放入输出之前对其应用HTML转义(但在应用任何过滤器之后)。这相当于手动将escape 过滤器应用于每个变量。

    唯一的例外是已经标记为“安全”的变量,无论是通过填充变量的代码,还是因为它已经应用safeescape过滤器。

    {% autoescape on %}
        {{ body }}
    {% endautoescape %}
    

      

    5.block

    定义可由子模板覆盖的块,例如:

    {% block title %}{{ section.title }}{% endblock %}
    

      

    6.comment

    忽略之间的所有内容可以在第一个标签中插入可选的注释。例如,在注释掉用于记录代码被禁用的原因的代码时,这非常有用。{% comment %}{% endcomment %}

    <p>Rendered text with {{ pub_date|date:"c" }}</p>
    {% comment "Optional note" %}
        <p>Commented out text with {{ create_date|date:"c" }}</p>
    {% endcomment %}
    

      comment 标签不能嵌套

    7.csrf_token

    此标记用于CSRF保护

    8.extends

    表示此模板扩展父模板的信号。

    此标记可以以两种方式使用:

    • {% extends "base.html" %}(带引号)使用文字值 "base.html"作为要扩展的父模板的名称。
    • {% extends variable %}使用的值variable如果变量求值为字符串,Django将使用该字符串作为父模板的名称。如果变量求值为一个Template对象,Django将使用该对象作为父模板。

    有关更多信息,请参见模板继承

    通常,模板名称相对于模板加载器的根目录。字符串参数也可以是以./开头的相对路径../

    9.include

    加载模板并使用当前上下文呈现它。这是一种在模板中“包含”其他模板的方法。

    模板名称可以是单引号或双引号中的变量或硬编码(带引号)字符串。

    此示例包含模板的内容"foo/bar.html"

    {% include "foo/bar.html" %}
    

      

    您可以使用关键字参数将其他上下文传递给模板:

    {% include "name_snippet.html" with person="Jane" greeting="Hello" %}
    

      

    10.load

    加载自定义模板标记集。

    {% load static %}
    

      加载静态资源文件

    11.now

    使用根据给定字符串的格式显示当前日期和/或时间。此类字符串可以包含格式说明符字符,如date过滤器部分中所述。

    It is {% now "jS F Y H:i" %}
    

    请注意,如果要使用“原始”值,则可以反斜杠转义格式字符串。在此示例中,“o”和“f”都是反斜杠转义的,因为否则每个都是一个格式字符串,分别显示年份和时间:

    It is the {% now "jS of F" %}
    

    您还可以使用语法将输出(作为字符串)存储在变量中。如果要在模板标记内部使用 ,例如:{% now "Y" ascurrent_year %}{% now %}blocktrans

    {% now "Y" as current_year %}
    {% blocktrans %}Copyright {{ current_year }}{% endblocktrans %}
    

      

    12.regroup

    通过公共属性重新组合相似对象的列表。

    这个复杂的标签,最好是用一个例子来说明:说不说cities 是包含字典代表城市的名单"name""population""country"键:

    cities = [
        {'name': 'Mumbai', 'population': '19,000,000', 'country': 'India'},
        {'name': 'Calcutta', 'population': '15,000,000', 'country': 'India'},
        {'name': 'New York', 'population': '20,000,000', 'country': 'USA'},
        {'name': 'Chicago', 'population': '7,000,000', 'country': 'USA'},
        {'name': 'Tokyo', 'population': '33,000,000', 'country': 'Japan'},
    ]
    

      

    ..并且您希望显示按国家/地区排序的分层列表,如下所示:

    • 印度
      • 孟买:19,000,000
      • 加尔各答:15,000,000
    • 美国
      • 纽约:20,000,000
      • 芝加哥:7,000,000
    • 日本
      • 东京:33,000,000

    您可以使用标记按国家/地区对城市列表进行分组。以下代码片段代码将实现此目的:{% regroup %}

    {% regroup cities by country as country_list %}
    
    <ul>
    {% for country in country_list %}
        <li>{{ country.grouper }}
        <ul>
            {% for city in country.list %}
              <li>{{ city.name }}: {{ city.population }}</li>
            {% endfor %}
        </ul>
        </li>
    {% endfor %}
    </ul>
    

      

    让我们来看看这个例子。有三个参数:要重新组合的列表,要分组的属性以及结果列表的名称。在这里,我们 属性重新组合列表并调用结果{% regroup %}citiescountrycountry_list

    {% regroup %}生成一个组对象的列表(在本例中country_list) 组对象是包含两个字段的实例 namedtuple()

    • grouper - 按分组的项目(例如,字符串“India”或“Japan”)。
    • list - 该组中所有项目的列表(例如,所有具有country ='India'的城市的列表)。

    使用dictsort过滤器对模板中的数据进行排序 ,如果您的数据位于词典列表中

    {% regroup cities|dictsort:"country" by country as country_list %}

    对其他属性进行分组

    任何有效的模板查找都是regroup标记的合法分组属性,包括方法,属性,字典键和列表项。例如,如果“country”字段是具有属性“description”的类的外键,则可以使用

    {% regroup cities by country.description as country_list %}
    

      

    13.url

    返回与给定视图和可选参数匹配的绝对路径引用(不带域名的URL)。将使用编码生成的路径中的任何特殊字符iri_to_uri()

    这是一种通过在模板中对URL进行硬编码来输出链接而不违反DRY原则的方法:

    {% url 'some-url-name' v1 v2 %}

    第一个参数是URL模式名称它可以是带引号的文字或任何其他上下文变量。其他参数是可选的,应该是空格分隔的值,将用作URL中的参数。上面的例子显示了传递位置参数。或者,您可以使用关键字语法:

    {% url 'some-url-name' arg1=v1 arg2=v2 %}
    

      

    14.widthratio

    对于创建条形图等,此标记计算给定值与最大值的比率,然后将该比率应用于常量。

    如果this_value是175,max_value是200,并且max_width是100,则上例中的图像将是88像素宽(因为175/200 = .875; .875 * 100 = 87.5,其被舍入到88)。

    在某些情况下,您可能希望捕获widthratio变量的结果例如,它可以是blocktrans这样的:

    {% widthratio this_value max_value max_width as width %}
    {% blocktrans %}The width is: {{ width }}{% endblocktrans %}
    

      

    15.with

    以更简单的名称缓存复杂变量。这在多次访问“昂贵”方法(例如,击中数据库的方法)时很有用。

    {% with total=business.employees.count %}
        {{ total }} employee{{ total|pluralize }}
    {% endwith %}
    

      

    填充的变量(在上面的示例中total)仅在标记之间可用{% with %}{% endwith %}

    您可以分配多个上下文变量:

    {% with alpha=1 beta=2 %}
        ...
    {% endwith %}
    

      

  • 相关阅读:
    MIPI DIsplay Panel And Linux Driver Model【转】
    Vim|多行行尾插入【转】
    LCD之mipi DSI接口驱动调试流程【转】
    Linux中的DRM 介绍【转】
    linux DRM driver 使用示例【转】
    从零开始写设备树DTS【转】
    linux内核中的宏ffs(x)【转】
    procps工具集 ----Linux中的可用内存指的是什么?【转】
    ps命令交叉编译【转】
    交叉编译Procps-ng-3.3.11【转】
  • 原文地址:https://www.cnblogs.com/AngesZhu/p/9953934.html
Copyright © 2011-2022 走看看