1.创建一个模板库
(1) 决定哪个Django应用应当拥有这个模板库, 确保把你的应用添加到 INSTALLED_APPS 中
(2) 在适当的Django应用包里创建一个 templatetags 目录。这个目录应当和 models.py 、 views.py 等处于同一层次。例如:

books/
__init__.py
models.py
templatetags/
views.py

在 templatetags 中创建两个空文件:一个 __init__.py (告诉Python这是一个包含了Python代码的包)和一个用来存放你自定义的标签/过滤器定义的文件。第二个文件的名字稍后将用来加载标签。例如,如果你的自定义标签/过滤器在一个叫作 poll_extras.py 的文件中,你需要在模板中写入如下内容:
{% load poll_extras %}
{% load %} 标签检查 INSTALLED_APPS 中的设置,仅允许加载已安装的Django应用程序中的模板库。
要成为有效的标签库,模块必须包含一个模块级的变量: register ,这是一个 template.Library 的实例。这个 template.Library 实例是包含所有已注册的标签及过滤器的数据结构。因此,在模块的顶部位置插入下述代码:
from django import template
register = template.Library()
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, '')
def lower(value): # Only one argument.
"Converts a string into all lowercase"
return value.lower()

这里是一些如何使用过滤器的例子:
{{ somevariable|cut:”0″ }}
当你在定义你的过滤器时,你需要用 Library 实例来注册它,这样就能通过Django的模板语言来使用了:

register.filter('cut', cut)
register.filter('lower', lower)

Library.filter() 方法需要两个参数:
过滤器的名称(一个字串)
过滤器函数本身
如果你使用的是Python 2.4或更新,你可以使用 register.filter() 作为一个装饰器:

@register.filter(name='cut')
def cut(value, arg):
return value.replace(arg, '')
@register.filter
def lower(value):
return value.lower()

像第二个例子中,如果你不使用 name 参数,那么Django将会使用函数名作为过滤器的名字。
下面是一个完整的模板库的例子,提供了一个 cut 过滤器:

from django import template
register = template.Library()
@register.filter(name='cut')
def cut(value, arg):
return value.replace(arg, '')

3. 自定义模板标签
(1)定义标签

The time is {% current_time “%Y-%m-%d %I:%M %p” %}.

(2)编写模板标签分析器mytag.py

from django import template
def do_current_time(parser, token):
try:
# split_contents() knows not to split quoted strings.
tag_name, format_string = token.split_contents()
except ValueError:
msg = '%r tag requires a single argument' % token.contents()[0]
raise template.TemplateSyntaxError(msg)
return CurrentTimeNode(format_string[1:-1])

(3) 编写模板节点

import datetime
class CurrentTimeNode(template.Node):
def __init__(self, format_string):
self.format_string = format_string
def render(self, context):
now = datetime.datetime.now()
return now.strftime(str(self.format_string))

(4) 注册标签
register = template.Library()
register.tag(‘current_time’, do_current_time)

@register.tag(name=”current_time”)
def do_current_time(parser, token):
# …
(4) 简单标签的快捷方式
Django 提供了一个帮助函数: simple_tag 。这个函数是 django.template.Library 的一个方法,它接受一个只有一个参数的函数作参数,把它包装在 render 函数和之前提及过的其他的必要单位中,然后通过模板系统注册标签。
我们之前的的 current_time 函数于是可以写成这样:

def current_time(format_string):
return datetime.datetime.now().strftime(format_string)
register.simple_tag(current_time)

在Python 2.4中,也可以使用修饰语法:
@register.simple_tag
def current_time(token):

有关 simple_tag 辅助函数,需要注意下面一些事情:
传递给我们的函数的只有(单个)参数。
在我们的函数被调用的时候,检查必需参数个数的工作已经完成了,所以我们不需要再做这个工作。
参数两边的引号(如果有的话)已经被截掉了,所以我们会接收到一个普通字符串。
5. 包含标签
(1)定义标签
{% show_results poll %}
(2)标签函数

@register.inclusion_tag('books/books_for_author.html')
def show_books_for_author(author):
books = author.book_set.all()
return {'books': books}

(3)标签模板

  • {% for book in books %}
  • {{ book }} {% endfor %}

转载请注明来源:http://www.qwolf.com/?p=176

Django笔记8(模板引擎)相关推荐

  1. Django 笔记4 -- 模板

    Django 笔记4 – 模板 Django 系列笔记是笔者学习.实践使用 Django 的相关笔记,大量参考了知了课堂的<Django零基础到项目实战>教程. 参考文档: Django官 ...

  2. python template languages_更换Django默认的模板引擎为jinja2的实现方法

    本机环境 操作系统:fedora24 python版本:3.5 Django版本:1.11.1 jinja2版本:2.9.6 为何要更换 DTL 先来谈谈Django的模板引擎,找了下,并没有一个确定 ...

  3. php模板引擎jinja,django使用jinja2模板引擎报错: ‘django.template.backends.django.DjangoTemplates’...

    TEMPLATES = [ { 'BACKEND': 'django.template.backends.jinja2.Jinja2', # 配置Jinja2模板引擎 'DIRS': [os.path ...

  4. SpringBoot笔记之模板引擎

    模板引擎 1. SpringBoot Web开发总览 1.1 Web开发静态资源处理 1.2 首页处理 2. Thymeleaf模板引擎 2.1 模板引擎 2.2 引入Thymeleaf 2.3 Th ...

  5. PHP笔记-Smarty模板引擎的使用

    进入官网下载4.0 将lib目录拷贝到项目中: 新建2个文件一个 smarty.php: <?phpinclude_once("smarty/Smarty.class.php" ...

  6. 【django】配置Jinja2模板引擎【2】

    1.安装Jinja2扩展包 pip install Jinja2 2.创建Jinja2模板引擎环境 在项⽬包⽬录-->utils⽬录中创建jinja2_env.py⽂件 from jinja2 ...

  7. Django配置开发环境和生产环境以及配置Jinja2模板引擎

    配置开发环境 在项目的目录(即就是settings.py的同级目录)创建settings的Python的包 在创建的settings的包中,创建dev.py,将原项目的setting.py中内容全部复 ...

  8. Django 模板引擎以及模板

    2019独角兽企业重金招聘Python工程师标准>>> 在Django框架中,可以使用两种模板引擎,一种是默认的Django模板引擎,还有一种是Jinja2模板引擎: 1.模版引擎的 ...

  9. SpringBoot学习笔记【part12】Web开发——Thymeleaf模板引擎

    SpringBoot 学习笔记 Part12 1. thymeleaf简介 SpringBoot默认不支持 JSP,需要引入第三方模板引擎技术实现页面渲染. Thymeleaf is a modern ...

  10. 【Youtobe trydjango】Django2.2教程和React实战系列七【模板templates和Django模板引擎】

    [Youtobe trydjango]Django2.2教程和React实战系列七[模板templates和Django模板引擎] 1. 修改视图函数 2. 新建模板文件夹和html文件 3. 项目配 ...

最新文章

  1. 万变不离其中----SQL必记语法
  2. 升级vue-cli为 cli3 并创建项目
  3. c语言p gt name,c语言中strcmp(p-name,s)是什么意思?
  4. CList添加出错AddTail();rror C2664: 'struct __POSITION *__thiscall CList错误
  5. java loadlibrary_java – System.loadLibrary不起作用.链中的第二个lib的UnsatisfiedLinkError...
  6. redhat linux 9.0 拷贝u盘的文件,肿么用U盘安装Linux,安装的是red hat 9.0…用Ubuntu很方便,redhat可以吗?...
  7. 客座编辑:武永卫,男,博士,清华大学计算机科学与技术系教授。
  8. thymeleaf 的 th:onclick js方法入参
  9. 持续集成部署Jenkins工作笔记0005---应用服务器设置账号密码说明
  10. 诺基亚自带36个铃声_vivo手机的6个隐藏功能,快开启,帮你玩转vivo
  11. 牛客网 暑期ACM多校训练营(第二场)D.money-贪心 or 动态规划
  12. 能做多大的单片机项目程序开发,就代表了你的敲代码的水平
  13. 【前端】javascript判断undefined、null、NaN;字符串包含等
  14. 《完整部署 OCS-NG》
  15. laravel访问路由在nginx服务器上无法处理
  16. Atitit java ftp client sumup apache common net jar 1.1. 协议解析 1 1.2. 读取文件 1 2. } 3 1. 下载文件 ftpCli
  17. php对url转码,如何使用php url中文转码
  18. vue3仿网易云移动应用
  19. ValueError: matmul: Input operand 1 does not have enough dimensions (has 0, gufunc core with ...)
  20. 相机标定基本理论——旋转矩阵基本性质

热门文章

  1. MYSQL 调优和使用必读
  2. 第15条:使可变性最小化
  3. POJ 3660 Cow Contest (闭包传递)
  4. 升级EXCHANGE2010到2013(C)
  5. linux下DNS服务器的搭建
  6. Q109:用PBRT渲染Blender导出的模型 (2)
  7. Python实现对nginx日志access.log统计
  8. 大数据分析技术有什么特点
  9. Window平台下通过cmd命令查看端口占用、查看进程、结束进程
  10. Tensorflow2.0入门教程(一)