django(三)---Template(2)

Django 模板标签

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

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

{% if %}标签接受and,or或者not来测试多个变量值或者否定一个给定的变量,例如: [java]   view pla c
{% 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 %}  


如果你想结合and和or来做高级逻辑,只需使用嵌套的{% if %}标签即可:
[java] view plain co
{% if athlete_list %}  
    {% if coach_list or cheerleader_list %}  
        We have athletes, and either coaches or cheerleaders!  
    {% endif %}  
{% endif %}  


多次使用同一个逻辑符号是合法的:
[java] view plain copy

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


没有{% elif %}标签,使用嵌套的{% if %}标签可以做到同样的事情:
[java] view plain copy

{% 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 %}标签,否则Django触发TemplateSyntaxError

for
{% for %}标签允许你按顺序遍历一个序列中的各个元素
Python的for语句语法为for X in Y,X是用来遍历Y的变量
每次循环模板系统都会渲染{% for %}和{% endfor %}之间的所有内容
例如,显示给定athlete_list变量来显示athlete列表:
[java] view plain copy

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


在标签里添加reversed来反序循环列表:
[java] view plain copy

{% for athlete in athlete_list reversed %}  
...  
{% endfor %}  
{% for %}标签可以嵌套:  
{% for country in countries %}  
    <h1>{{ country.name }}</h1>  
    <ul>  
    {% for city in country.city_list %}  
        <li>{{ city }}</li>  
    {% endfor %}  
    </ul>  
{% endfor %}  


系统不支持中断循环,如果你想这样,你可以改变你想遍历的变量来使得变量只包含你想遍历的值
类似的,系统也不支持continue语句,本章后面的“哲学和限制”会解释设计的原则
{% for %}标签内置了一个forloop模板变量,这个变量含有一些属性可以提供给你一些关于循环的信息
1,forloop.counter表示循环的次数,它从1开始计数,第一次循环设为1,例如:
[java] view plain copy

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


2,forloop.counter0类似于forloop.counter,但它是从0开始计数,第一次循环设为0
3,forloop.revcounter表示循环中剩下的items数量,第一次循环时设为items总数,最后一次设为1
4,forloop.revcounter0类似于forloop.revcounter,但它是表示的数量少一个,即最后一次循环时设为0
5,forloop.first当第一次循环时值为True,在特别情况下很有用:
[java] view plain copy

{% for object in objects %}  
    {% if forloop.first %}<li class="first">{% else %}<li>{% endif %}  
    {{ object }}  
    </li>  
{% endfor %}  


6,forloop.last当最后一次循环时值为True
[java] view plain copy

{% for link in links %}{{ link }}{% if not forloop.last %} | {% endif %}{% endfor %}  

7,forloop.parentloop在嵌套循环中表示父循环的forloop:
[java] view plain copy

{% 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的变量,Django会用{% for %}标签替代它
Django会在for标签的块中覆盖你定义的forloop变量的值
在其他非循环的地方,你的forloop变量仍然可用
我们建议模板变量不要使用forloop,如果你需要这样做来访问你自定义的forloop,你可以使用forloop.parentloop

ifequal/ifnotequal
Django模板系统并不是一个严格意义上的编程语言,所以它并不允许我们执行Python语句
(我们会在‘哲学和限制‘一节详细讨论)。
然而在模板语言里比较两个值并且在他们一致的时候显示一些内容,确实是一个在常见不过的需求了——所以Django提供了ifequal标签。
{% ifequal %}比较两个值,如果相等,则显示{% ifequal %}和{% endifequal %}之间的所有内容:
[java] view plain copy

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


参数可以是硬编码的string,单引号和双引号均可,下面的代码是合法的:
[java] view plain copy

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


和{% if %}一样,{% ifequal %}标签支持{% else %}
[java] view plain copy

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


其它的模板变量,strings,integers和小数都可以作为{% ifequal %}的参数:
[java] view plain copy

{% ifequal variable 1 %}  
{% ifequal variable 1.23 %}  
{% ifequal variable 'foo' %}  
{% ifequal variable "foo" %}  


其它的Python类型,如字典、列表或booleans不能硬编码在{% ifequal %}里面,下面是不合法的:
[java] view plain copy

{% ifequal variable True %}  
{% ifequal variable [1, 2, 3,]%}  
{% ifequal variable {'key': 'value'} %  

如果你需要测试某个变量是true或false,用{% if %}即可

注释
和HTML或编程语言如Python一样,Django模板语言允许注释{# #},如:
[java] view plain copy

{# This is a comment #}  


模板渲染时注释不会输出,一个注释不能分成多行
下面的模板渲染时会和模板中的内容一样,注释标签不会解析成注释
This is a {# comment goes here
and spans another line #}
test.


注释标签

Django 注释使用 {# #}。

{# 这是一个注释 #}

过滤器

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

{{ name|lower }}

{{ name }} 变量被过滤器 lower 处理后,文档大写转换文本为小写。

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

{{ my_list|first|upper }}

以上实例将第一个元素并将其转化为大写。

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

{{ bio|truncatewords:"30" }}

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

其他过滤器:

  • addslashes : 添加反斜杠到任何反斜杠、单引号或者双引号前面。
  • date : 按指定的格式字符串参数格式化 date 或者 datetime 对象,实例:
    {{ pub_date|date:"F j, Y" }}
  • length : 返回变量的长度。
  • # 1  add          :   给变量加上相应的值
       #
       # 2  addslashes   :    给变量中的引号前加上斜线
       #
       # 3  capfirst     :    首字母大写
       #
       # 4  cut          :   从字符串中移除指定的字符
       #
       # 5  date         :   格式化日期字符串
       #
       # 6  default      :   如果值是False,就替换成设置的默认值,否则就是用本来的值
       #
       # 7  default_if_none:  如果值是None,就替换成设置的默认值,否则就使用本来的值
    


include 标签

{% include %} 标签允许在模板中包含其它的模板的内容。

下面这个例子都包含了 nav.html 模板:

{% include "nav.html" %}

csrf_token标签


用于生成csrf_token的标签,用于防治跨站攻击验证。 其实,这里是会生成一个input标签,和其他表单标签一起提交给后台的。


{% url %}


引用路由配置的地址

<form action="{% url "bieming"%}" >
          <input type="text">
          <input type="submit"value="提交">
          {%csrf_token%}
</form>



{% with %}

用更简单的变量名替代复杂的变量名


{% with total=fhjsaldfhjsdfhlasdfhljsdal %} {{ total }} {% endwith %}



{% verbatim %}

禁止render

{% verbatim %}
         {{ hello }}
{% endverbatim %}


=================================================================

加载标签库:自定义filter和simple_tag

a、在app中创建templatetags模块(必须的)
b、创建任意 .py 文件,如:my_tags.py

from django import template
from django.utils.safestring import mark_safe

register = template.Library()   #register的名字是固定的,不可改变


@register.filter
def filter_multi(v1,v2):
    return  v1 * v2


@register.simple_tag
def simple_tag_multi(v1,v2):
    return  v1 * v2


@register.simple_tag
def my_input(id,arg):
    result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
    return mark_safe(result)


c、在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py :{% load my_tags %}

d、使用simple_tag和filter(如何调用)


-------------------------------.html
{% load xxx %}   #首行
    
    
    
    
 # num=12
{{ num|filter_multi:2 }} #24

{{ num|filter_multi:"[22,333,4444]" }}


{% simple_tag_multi 2 5 %}  参数不限,但不能放在if for语句中
{% simple_tag_multi num 5 %}


e、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.




注意:
filter可以用在if等语句后,simple_tag不可以

{% if num|filter_multi:30 > 100 %}
    {{ num|filter_multi:30 }}
{% endif %}


=================================================================

模板继承
模板可以用继承的方式来实现复用。
接下来我们先创建之前项目的 templates 目录中添加 base.html 文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .top{
            width: 100%;
            height: 50px;
            background-color: blue;
            position: fixed;
            top: 0;
            left: 0;
            right: 0;
        }
        .box{
            margin-top: 50px;
        }
    </style>
</head>
<body>
<div class="top"></div>

<div class="box">
    {% block replace %}
    <p>Replace the box</p>
    {% endblock %}

</div>

</body>
</html>

以上代码中,名为 replace 的 block 标签是可以被继承者们替换掉的部分。
所有的 {% block %} 标签告诉模板引擎,子模板可以重载这些部分。
index.html 中继承 base.html,并替换特定 block,index.html 修改后的代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% extends "base.html" %}

{% block replace %}

    <p>Hi,brothers</p>

{% endblock %}
</body>
</html>








                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值