Django-模板语言和过滤器
Django模板语言
首先模板只是一个文本文件,它可以生成任何基于文本的格式(HTML、XML、CSS等),模板中包含变量,在模板被渲染的时候替换为最终的值,以及控制模板逻辑的标签。
变量使用{{ 变量名 }} , 逻辑运算使用 {% tag%}。
简单的基本模板代码:
{% extends "base_generic.html" %} {% block title %}{{ section.title }}{% endblock %} {% block content %} <h1>{{ section.title }}</h1> {% for story in story_list %} <h2> <a href="{{ story.get_absolute_url }}"> {{ story.headline|upper }} </a> </h2> <p>{{ story.tease|truncatewords:"100" }}</p> {% endfor %} {% endblock %}
一、变量
变量看起来像这样:{{ variable}}
.。
当模板引擎遇到变量时,会评估该变量并将其替换为最终的值。变量名由下划线、字母、数字组成。点(.)也出现在变量部分,但具有特殊的含义,使用点(.)来访问变量的属性。
当模板引擎遇到点(.)的时候,会按照以下顺序尝试查找:
字典的key
属性或者方法
数字索引
如果点(.)后是函数名,则不带参数调用它,并且省略括号,那么变量最终的结果是函数的返回值.
需要注意的是:字典中如果key名为‘items’,将会得到字典中item对应的值,而不是调用字典的.items()方法
获取变量的值demo:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>模板语言使用</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <p> 单个变量<span style="color: red;">{ { 变量值 } }</span>: {{ name }} </p> <hr> <p> 列表变量: {{ name_list }} <br> 列表可以使用索引的方式取值name_list.0\name_list.1: {{ name_list.0 }}<br> 列表可以使用索引的方式取值name_list.0\name_list.1: {{ name_list.1 }}<br> </p> <hr> <p> 字典变量: {{ name_dict }}<br> 字典变量通过.key进行访问name_dict.first_name: {{ name_dict.first_name }}<br> 字典变量通过.key进行访问name_dict.last_name: {{ name_dict.last_name }}<br> 字典是无序的,无法通过索引取值name_dict.0:{{ name_dict.0 }}<br> </p> <hr> <p> 传递一个对象 p1:{{ p1 }} <br> 传递一个对象 p2:{{ p2 }} <br> p1 name: {{ p1.name }},p1 age:{{ p1.age }} <br> p2 name: {{ p2.name }},p2 age:{{ p2.age }} <br> </p> <hr> <p> 对象列表的方式: obj_list.0->p1 obj_list.0.name/age: <br> p1 name: {{ obj_list.0.name }} <br> p1 age: {{ obj_list.0.age }} <br> </p> <hr style="color: red;"> </body> </html>
二、标签
标签看起来想这样{% tag %}。首先标签比变量更复杂,一些执行逻辑判断、循环遍历等,还有一些将外部信息加载到模板中供以后的变量使用。一些标签需要开始标签和结束标签{% tag %} .... {% endtag %}。Django附带大约二十个内置模板标签。您可以在内置标签参考中阅读所有关于它们的内容。这里只介绍常用的标签:
for
循环播放数组中的每个项目。例如,要显示以下提供的运动员列表athlete_list
:
<ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} </ul>
for ... empty
for 标签带有一个可选的{% empty %} 从句,以便在给出的组是空的或者没有被找到时,可以有所操作。
<ul> {% for user in user_list %} <li>{{ user.name }}</li> {% empty %} <li>空空如也</li> {% endfor %} </ul>
if,else,elif
评估一个变量,如果该变量为“true”,则显示该块的内容:
{% if athlete_list %} Number of athletes: {{ athlete_list|length }} {% elif athlete_in_locker_room_list %} Athletes should be out of the locker room soon! {% else %} No athletes. {% endif %}
在上面,如果athlete_list
不是空的,运动员的数量将被变量显示。否则,如果不为空,则会显示“运动员应该出局......”消息。如果两个列表都是空的,“没有运动员”。将被显示。
if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。
with
使用一个简单地名字缓存一个复杂的变量,当你需要使用一个“昂贵的”方法(比如访问数据库)很多次的时候是非常有用的
{% with total=business.employees.count %} {{ total }} employee{{ total|pluralize }} {% endwith %}
三、Filter
使用Filter修改显示的变量。
过滤器看起来像这样:{value|filter:'...'}。value是要修改的变量,filter是过滤器函数,冒号(:)后是参数。Django提供了大约60个内置模板过滤器。您可以在内置的过滤器参考中阅读所有关于它们的内容。为了让您了解可用的功能,以下是一些更常用的模板过滤器:
defalue
如果变量为假或空,则使用给定的默认值。否则,使用变量的值。例如:
{{ value|default:"nothing" }}
如果value
未提供或为空,则上面将显示“ nothing
”。
length
返回值的长度。这适用于字符串和列表。例如:
{{ value|length }}
如果value是['a','b','c','d'],输出将是4。
filesizefamat
格式化为一个“人类可读”的文件大小的值(即, ,等等)。例如:'13 KB'
'4.1 MB'
'102 bytes'
{{ value|filesizeformat }}
-
如果
value
是123456789,输出将是。117.7 MB
再次,这些只是几个例子; 请参阅完整列表的内置过滤器参考。
您也可以创建自己的自定义模板过滤器;
四、自定义Filter
1. 首先需要在APP目录下创建一个templates目录(包)
需要注意:
添加templatetags 模块后,您需要重新启动服务器,然后才能在模板中使用标签或过滤器。
2. 创建包含自定义标签和过滤器py文件:
polls/ __init__.py models.py templatetags/ __init__.py poll_extras.py views.py
在你的模板中,你可以使用如下的方式引入自定义标签和过滤器:
{% load poll_extras %}
3. 导入template
from django import template
4. 生成一个注册器,它是一个template.Library()实例
register = template.Libraty()
5. 编写自定义模板过滤器
# 编写一个不接受参数的自定义filter def add_a(arg1): return '{}_a'.format(arg1) # 编写一个接受参数的自定义filter def add(arg1,arg2): return '{}_{}'.format(arg1,arg2) ''' arg1 : 是必须的参数,接受管道符之前 要修改的value arg2 : 是用户传过来的参数,filter冒号后 '''
6. 自测自定义过滤器
@register.filter(name='addA') # 注册自定义过滤器 def add_a(arg1): return '{}_a'.format(arg1) @register.filter(name='add') # 注册自定义过滤器 def add(arg1,arg2): return '{}_{}'.format(arg1,arg2)
7. 使用自定义过滤器
1.在页面中首先导入{% load myfilter%} #加载templates包下的自定义filter py文件 {% load myfilter %} 2. 使用 {{ '123'|add_a }} 最终的结果是: 123a {{ '123'|add:"abc" }} 最终的结果是: 123abc
3.需要重启服务器
五、simpletag
和自定义filter类似,只不过接收更灵活的参数。
定义注册simple tag
@register.simple_tag(name="plus") def plus(a, b, c): return "{} + {} + {}".format(a, b, c)
使用自定义simple tag
{% load app01_demo %} {# simple tag #} {% plus "1" "2" "abc" %}
六、inclusion_tag 返回一个HTML片段
多用于返回html代码片段
示例:
templatetags/my_inclusion.py
from django import template register = template.Library() @register.inclusion_tag('result.html') def show_results(n): n = 1 if n < 1 else int(n) data = ["第{}项".format(i) for i in range(1, n+1)] return {"data": data}
templates/snippets/result.html
<ul> {% for choice in data %} <li>{{ choice }}</li> {% endfor %} </ul>
templates/index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>inclusion_tag test</title> </head> <body> {% load inclusion_tag_test %} {% show_results 10 %} </body> </html>