Django标签和过滤器

过滤器格式{{   }}

标签格式{%  %}

模板中过滤器filter只能使用一个参数,自定义标签中则可以使用多个参数!!!

过滤器能够采用链式的方式使用,例如:{{ text | escape | linebreaks }}

过滤器的参数中如果带有空格,那么需要用引号引起来,例如:{{ list | join : ", "}}

标签参数不限,但不能放在if for语句中,就是当前if for那句代码里,在if for 其他地方可以使用!而过滤器可以用在if for语句中

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

  1. <ul>  
  2. {% for athlete in athlete_list %}  
  3. <li>{{ athlete.name }}</li>  
  4. {% endfor %}  
  5. </ul>  


在标签里添加reversed来反序循环列表:

  1. {% for athlete in athlete_list reversed %}  
  2. ...  
  3. {% endfor %}  
  4. {% for %}标签可以嵌套:  
  5. {% for country in countries %}  
  6. <h1>{{ country.name }}</h1>  
  7. <ul>  
  8. {% for city in country.city_list %}  
  9. <li>{{ city }}</li>  
  10. {% endfor %}  
  11. </ul>  
  12. {% endfor %}  


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

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


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

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


6forloop.last当最后一次循环时值为True

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


7forloop.parentloop在嵌套循环中表示父循环的forloop

  1. {% for country in countries %}  
  2. <table>  
  3. {% for city in country.city_list %}  
  4. <tr>  
  5. <td>Country #{{ forloop.parentloop.counter }} </td>  
  6. <td>City #{{ forloop.counter }}</td>  
  7. <td>{{ city }}</td>  
  8. </tr>  
  9. {% endfor %}  
  10. </table>  
  11. {% endfor %}  


富有魔力的forloop变量只能在循环中得到,当模板解析器到达{% endfor %}forloop就消失了
如果你的模板context已经包含一个叫forloop的变量,Django会用{% for %}标签替代它
Django会在for标签的块中覆盖你定义的forloop变量的值
在其他非循环的地方,你的forloop变量仍然可用
我们建议模板变量不要使用forloop,如果你需要这样做来访问你自定义的forloop,你可以使用forloop.parentloop

一些实用但较少见的内建标签

comment

注释,{% comment %} 和 {% endcomment %}之间的内容被解释为注释

firstof

返回列表中第一个可用(非False)的变量或者字符串,注意的是firstof中的变量非自动转义

{% firstof var1 var2 var3 "fallback value" %}

for

for循环,可以在后面加入reversed参数遍历逆序的列表

{% for obj in list reversed %}

for...empty

如果for循环的参数-列表为空,将执行empty里面的内容

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

default_if_none
             使用形式:{{ value | default_if_none:"nothing" }},例如,如果value是None,那么输出将是nothing
             意义:如果value是None,那么输出将使用缺省值

length
使用形式:{{ value | length }}
意义:返回value的长度。

wordcount
返回字符串中单词的数目

自定义标签和自定义过滤器

在app目录下建一个子目录,目录名称必须为templatetags,然后在该目录下新建一个.py文件(如Mytag.py),在该文件具体自定义标签和过滤器

#!/usr/bin/env python  
# _*_ coding:utf-8 _*_
# @File : blog/BlogAPP/templatetags/Mytag.py
from django import template
register = template.Library()

# 自定义一个有关时间转化的过滤器
@register.filter
def beijingtime(t):
"""
参数 t 的类型为datetime.datetime,形式如2017-09-11 23:12:34.634145 <class 'datetime.datetime'>
"""
from datetime import datetime
return datetime.fromtimestamp(t.timestamp()).strftime("%Y-%m-%d %H:%M")


# 自定义一个css路径的标签
@register.simple_tag
def rbac_css():
    file_path = os.path.join('ql','theme','rbac.css')
if os.path.exists(file_path):
return mark_safe(open(file_path,'r',encoding='utf8').read())
else:
raise Exception("rbac主题未找到")

用法如下在模板html中
{% load Mytag %}
<style>
{% rbac_css %}
</style>
<span>{{ comment_item.creat_time|beijingtime }}</span>
 
原文地址:https://www.cnblogs.com/ALXPS/p/7638258.html