Django 模版语言详解
一.简介
模版是纯文本文件。它可以产生任何基于文本的的格式(HTML,XML,CSV等等)。
模版包括在使用时会被值替换掉的 变量,和控制模版逻辑的 标签。
例:
- {% 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 %}
二.使用
1.变量
格式:
- {{ variable }}
变量命名规则
1.变量的命名包括任何字母数字以及下划线 ("_")的组合
2.不能在变量名称中使用空格和标点符号
当模版系统遇到点("."),它将以这样的顺序查询:
- 字典查询(Dictionary lookup)
- 属性或方法查询(Attribute or method lookup)
- 数字索引查询(Numeric index lookup)
例;
- {#如果后台 渲染传过来的是字典格式的数据 那么前端页面解析值 dict={"k1":"v1"} 假设传的是{"dict": dict} 前端页面取值 .字典key值#}
- <h1>{{dict.k1}}</h1>
2.过滤器
可以通过使用 过滤器来改变变量的显示
格式:
- {{ name|lower }}
管道符过滤,过滤器能够被“串联”。一个过滤器的输出将被应用到下一个
过滤器参数;
- {{ item.content |truncatewords:30 }} <!-- 只显示 content 变量的前30个词 -->
default
- {{ value|default:"nothing" }} <!--如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值-->
length
返回值的长度。它对字符串和列表都起作用
- {{ value|length }}
filesizeformat
将该数值格式化为一个 “人类可读的” 文件容量大小 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)
- {{ value|filesizeformat }}
add
把add后的参数加给value
- {{ value|add:"2" }} <!--如果 value 为 4,则会输出 6.-->
capfirst
将变量首字母变大写
- {{ value|capfirst }} <!--如果value是test过滤后转为Test-->
cut
移除value中所有的与给出的变量相同的字符串
- {{ value|cut:" " }}
dictsort
根据指定的key值对列表字典排序,并返回
- {{ value|dictsort:"name" }}
如,给定的值是:
- [
- {'name': 'peter', 'age': 19},
- {'name': 'amy', 'age': 22},
- {'name': 'jim', 'age': 31},
- ]
那么结果将是;
- [
- {'name': 'amy', 'age': 22},
- {'name': 'jim', 'age': 31},
- {'name': 'peter', 'age': 19},
- ]
也可以处理较为复杂的;
- {% for book in books|dictsort:"author.age" %}
- * {{ book.title }} ({{ book.author.name }})
- {% endfor %}
如给定值为:
- [
- {'title': '', 'author': {'name': 'George', 'age': 45}},
- {'title': 'Timequake', 'author': {'name': 'Kurt', 'age': 75}},
- {'title': 'Alice', 'author': {'name': 'Lewis', 'age': 33}},
- ]
那么结果为:
- * Alice (Lewis)
- * 1984 (George)
- * Timequake (Kurt)
random
随机返回一个值
- {{ value|random }}
如果 value 是 列表 ['a', 'b', 'c', 'd'], 可能输出的是 "b"
slice
切片
- {{ some_list|slice:":2" }}
如果 some_list 是 ['a', 'b', 'c'], 输出结果为 ['a', 'b']
truncatewords
字符串截断
- {{ value|truncatewords:2 }}
如果 value 是 "Joel is a slug",输出 "Joel is ...".
3.标签
格式
- {% tag %}
简介
标签比变量复杂得多:有些用于在输出中创建文本,有些用于控制循环或逻辑,有些用于加载外部信息到模板中供以后的变量使用。
有些标签需要开始标签和结束标签(例如{% tag %} ... tag contents ... {% endtag %})
常用标签;
for标签
格式
- {% for athlete in athlete_list %}
- <li>{{ athlete.name }}</li>
- {% endfor %}
if,elif and else
计算一个变量,并且当变量是“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 %}
4.注释
要注释模版中一行的部分内容,使用注释语法 {# #}
三.模版继承
模版继承可以让您创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 blocks 。
例;
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <link rel="stylesheet" href="style.css" />
- <title>{% block title %}My amazing site{%/span> endblock %}</title>
- </head>
- <body>
- <div id="sidebar">
- {% block sidebar %}
- <ul>
- <li><a href="/">Home</a></li>
- <li><a href="/blog/">Blog</a></li>
- </ul>
- {% endblock %}
- </div>
- <div id="content">
- {% block content %}{% endblock %}
- </div>
- </body>
- </html>
这个模版,我们把它叫作 base.html, 它定义了一个可以用于两列排版页面的简单HTML骨架。“子模版”的工作是用它们的内容填充空的blocks
子模版可能看起来是这样的:
- {% extends "base.html" %}/span>
- {% block title %}My amazing blog{% endblock %}
- {% block content %}
- {% for entry in blog_entries %}
- <h2>{{ entry.title }}</h2>
- <p>{{ entry.body }}</p>
- {% endfor %}
- {% endblock %}
extends 标签是这里的关键。它告诉模版引擎,这个模版“继承”了另一个模版。当模版系统处理这个模版时,首先,它将定位父模版——在此例中,就是“base.html”。
模版引擎将注意到 base.html 中的三个 block 标签,并用子模版中的内容来替换这些block。根据 blog_entries 的值,输出可能看起来是这样的:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <link rel="stylesheet" href="style.css" />
- <title>My amazing blog</title>
- </head>
- <body>
- <div id="sidebar">
- <ul>
- <li><a href="/">Home</a></li>
- <li><a href="/blog/">Blog</a></li>
- </ul>
- </div>
- <div id="content">
- <h2>Entry one</h2>
- <p>This is my first entry.</p>
- <h2>Entry two</h2>
- <p>This is my second entry.</p>
- </div>
- </body>
- </html>
使用继承的一个常用方式是类似下面的三级结构:
- 创建一个 base.html 模版来控制您整个站点的主要视觉和体验。
- 为您的站点的每一个“分支”创建一个base_SECTIONNAME.html 模版。例如, base_news.html, base_sports.html。这些模版都继承自 base.html ,并且包含了每部分特有的样式和设计。
- 为每一种页面类型创建独立的模版,例如新闻内容或者博客文章。这些模版继承对应分支的模版
母版结构
- {% block content %}
- ...
- {% endblock content %}
四.自动HTML转义
默认情况下,Django 中的每个模板会自动转义每个变量的输出。明确地说,下面五个字符被转义:
- < 会转换为<
- > 会转换为>
- ' (单引号) 会转换为'
- " (双引号)会转换为 "
- & 会转换为 &
如何关闭
4.1 用于模板代码块
要控制模板上的自动转义,将模板(或者模板中的特定区域)包裹在autoescape标签 中
- {% autoescape off %}
- Hello {{ name }}
- {% endautoescape %}
autoescape标签接受on 或者 off作为它的参数。有时你可能想在自动转义关闭的情况下强制使用它。下面是一个模板的示例:
- Auto-escaping is on by default. Hello {{ name }}
- {% autoescape off %}
- This will not be auto-escaped: {{ data }}.
- Nor this: {{ other_data }}
- {% autoescape on %}
- Auto-escaping applies again: {{ name }}
- {% endautoescape %}
- {% endautoescape %}
自动转义标签作用于扩展了当前模板的模板,以及通过 include 标签包含的模板,就像所有block标签那样。例如:
- {% autoescape off %}
- <h1>{% block title %}{% endblock %}</h1>
- {% block content %}
- {% endblock %}
- {% endautoescape %}
base.html
- {% extends "base.html" %}
- {% block title %}This & that{% endblock %}
- {% block content %}{{ greeting }}{% endblock %}
child.html
五.自定义simple_tag
自定义simple_tag
- {% load humanize %}
- {{ 45000|intcomma }}
上面的例子中, load标签加载了humanize标签库,之后我们可以使用intcomma过滤器。如果你开启了django.contrib.admindocs,你可以查询admin站点中的文档部分,来寻找你的安装中的自定义库列表。
load标签可以接受多个库名称,由空格分隔。例如
- {% load humanize i18n %}
5.1 自定义标签代码而已
自定义模板标签和过滤器必须位于Django 的某个应用中。如果它们与某个已存在的应用相关,那么将其与应用绑在一起才有意义;否则,就应该创建一个新的应用来包含它。
这个应用应该包含一个templatetags 目录,和models.py、views.py等文件处于同一级别目录下,如果目录不存在则创建它——不要忘记创建__init__.py 文件以使得该目录可以作为Python 的包。在添加这个模块以后,在模板里使用标签或过滤器之前你将需要重启服务器。新建 PY文件
切记:目录名一定要是templatetags
如:
- #!/usr/bin/env python
- #coding:utf-8
- from django import template
- from django.utils.safestring import mark_safe
- from django.template.base import resolve_variable, Node, TemplateSyntaxError
- register = template.Library()
- @register.simple_tag
- def my_simple_time(v1,v2,v3):
- return v1 + v2 + v3
- @register.simple_tag
- def my_input(id,arg):
- result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
- return mark_safe(result)
然后在你的模板中你应当这样使用
- {% load extend_temp %}
为了成为一个可用的标签库,这个模块必须包含一个名为 register的变量,它是template.Library 的一个实例,所有的标签和过滤器都是在其中注册的。所以把如下的内容放在你的模块的顶部:
- from django import template
- register = template.Library()
5.2 编写自定义模板过滤器
自定义过滤器就是一个带有一个或两个参数的Python 函数:
- (输入的)变量的值 —— 不一定是字符串形式。
- 参数的值 —— 可以有一个初始值,或者完全不要这个参数。
例如,在{{ var|foo:"bar" }}中,foo过滤器应当传入变量var和参数 "bar"。
由于模板语言没有提供异常处理,任何从过滤器中抛出的异常都将会显示为服务器错误。因此,如果有合理的值可以返回,过滤器应该避免抛出异常。在模板中有一个明显错误的情况下,引发一个异常可能仍然要好于用静默的失败来掩盖错误
例 ;
- def cut(value, arg):
- """Removes all values of arg from the given string"""
- return value.replace(arg, '')
下面是这个过滤器应该如何使用
- {{ somevariable|cut:"" }}
大多数过滤器没有参数。在这种情况下,你的函数不带这个参数即可。示例︰
- def lower(value): # 只能是一个参数.
- """变小写"""
- return value.lower()
5.3 注册自定义过滤器
django.template.Library.filter()
一旦你写好了你的自定义过滤器函数,你就开始需要把它注册为你的 Library实例,来让它在Django模板语言中可用
- register.filter('cut', cut)
- register.filter('lower', lower)
Library.filter()方法需要两个参数:
- 过滤器的名称(一个字符串对象)
- 编译的函数 – 一个Python函数(不要把函数名写成字符串)
你还可以把register.filter()用作装饰器:
- @register.filter(name='cut')
- def cut(value, arg):
- return value.replace(arg, '')
- @register.filter
- def lower(value):
- return value.lower()
- @register.filter
- def detail3(value,arg):
- """
- 查看余数是否等于remainder arg="1,2"
- :param counter:
- :param allcount:
- :param remainder:
- :return:
- """
- allcount, remainder = arg.split(',')
- allcount = int(allcount)
- remainder = int(remainder)
- if value%allcount == remainder:
- return True
- return False
详细参考:http://python.usyiyi.cn/django/howto/custom-template-tags.html
Django 模版语言详解的更多相关文章
- 第三章:模版层 - 1:Django模板语言详解
本节将介绍Django模版系统的语法.Django模版语言致力于在性能和简单性上取得平衡. 如果你有过其它编程背景,或者使用过一些在HTML中直接混入程序代码的语言,那么你需要记住,Django的模版 ...
- Django模板语言详解
本节将介绍Django模版系统的语法.Django模版语言致力于在性能和简单性上取得平衡. 如果你有过其它编程背景,或者使用过一些在HTML中直接混入程序代码的语言,那么你需要记住,Django的模版 ...
- Django入门基础详解
本次使用django版本2.1.2 安装django 安装最新版本 pip install django 安装指定版本 pip install django==1.10.1 查看本机django版本 ...
- 第五篇Django URL name 详解
Django URL name 详解 利用Django开发网站,可以设计出非常优美的url规则,如果url的匹配规则(包含正则表达式)组织得比较好,view的结构就会比较清晰,比较容易维护. Djan ...
- Django模版语言 格式化显示 后台datatime()时间
Django模版语言 格式化显示 后台datatime()时间 场景描述:
- 原来Github上的README.md文件这么有意思——Markdown语言详解(sublime text2 版本)
一直想学习 Markdown 语言,想起以前读的一篇 赵凯强 的 博客 <原来Github上的README.md文件这么有意思——Markdown语言详解>,该篇博主 使用的是Mac系统, ...
- Django模版语言的复用 1. include标签--模版导入 2.inclusion_tag自定义标签--模版导入 3.母版
include标签--模版导入 ''' 前提:项目中,往往会出现多个页面拥有一个或几个相同的页面版块,或是一个页面多个页面版块是相同的 如何运用:可以将多个样式标签的集合进行封装,对外提供版块的名字( ...
- 魔方Newlife.Cube权限系统的使用及模版覆盖详解
讲人:大石头 时间:2018-11-14 晚上20:00 地点:钉钉群(组织代码BKMV7685)QQ群:1600800 内容:魔方Newlife.Cube权限系统的使用及模版覆盖详解 准备 源码地址 ...
- Django models Fild详解
本文参考自:django官方文档models/field 在model中添加字段的格式一般为: field_name = field_type(**field_options) 一 field o ...
随机推荐
- MongoDB更新文档
说明:来看一下关系型数据库的update语句 UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某 其中where子句就类似查询文本,定位要更改的子表,set子句类似于修改器,更 ...
- 轻松自动化---selenium-webdriver(python) (九)
本节重点: 上传文件 文件上传操作也比较常见功能之一,上传功能没有用到新有方法或函数,关键是思路. 上传过程一般要打开一个本地窗口,从窗口选择本地文件添加.所以,一般会卡在如何操作本地窗口添加上传文件 ...
- Android之Notification介绍
Notification就是在桌面的状态通知栏.这主要涉及三个主要类: Notification:设置通知的各个属性. NotificationManager:负责发送通知和取消通知 Notifica ...
- java基础--相等
学习:http://www.cnblogs.com/dolphin0520/p/3780005.html#3163302 后发现居然有这么个东西,当然也不会注意什么自动拆箱和装箱,只知道用就行了.不过 ...
- 基于HTML5的Drag and Drop生成图片Base64信息
HTML5的Drag and Drop是很不错的功能,网上使用例子较多如 http://html5demos.com/drag ,但这些例子大部分没实际用途,本文将搞个有点使用价值的例子,通过Drag ...
- 关于HttpHandler的相关知识总结
一.关于IHttpHandler.IsReusable 很多人不明白,这哥们到底干嘛的,估计是微软最初的一个想法--让一个对象可以一直不断地被重复使用 ,但这个想法不成熟,会带来很多隐藏问题,一个对象 ...
- qml基础学习 模型视图(一)
一.理解qml模型和视图 qt的发展是迅速的,虽然在每一个release版本中或多或少都有bug,但是作为一个庞大的gui库,no,应该说是一个开发框架开说,qt已经算是做的相当好.qml部分是qt4 ...
- 博客已经转移到http://geekori.cn,本博客不再更新
已经建立了独立博客:极客起源(http://geekori.cn),并将大部分博文已经转移到新的博客,本博客不再更新.
- js学习笔记(一)
1.数组实用方法大全 //给数组添加个方法,返回数组中的最大值 Array.prototype.max = function() { return Math.max.apply(null,this); ...
- img[src*="same"]{}
假如你有一组图片,你想选择其中一些名字中带有same的图片,那么你就可以用这种写法,这里的意思就是选择所有正确路径下名字中带有same的图片文件. 譬如说:me_same.png,you_same.p ...