Django 自定义 过滤器和模板标签
代码布局(自定义的代码,放在哪里) 二种方式:
1. 某个app特有的
	-app 目录下,templatetags 文件夹     ** 必需是这个名称的包(目录中有__init__.py文件)
	-再到 templatetags 文件夹下创建python模块(py文件)
2. 定义复用
	-创建一个新的app,将他们定义在新的app中,在INSTALL_APPS
	注册,然后就可以应用
-在 templatetags 文件夹下新建 tags.py #文件名自己取
以下为文件内容:
# 自定义模板标签 和 过滤器 from django.template import Library def to_male(value, arg='zh'):
dic = {
'zh': ('女', '男'),
'en': ('famle', 'male')
}
return dic[arg][value] register = Library() # 实例化 Library对象, *****变量名 必须为:register
register.filter('to_male', to_male)
{% load static %}  # 加载 静态文件路径设置
{% load tags %}   # 加载 自定义<过滤器和 模板标签>库
 <div>
<table class="table">
    <tr>
       <td>序号</td>
       <td>名字</td>
       <td>性别</td>
       <td>年龄</td>
    </tr>
{#for 模板  endfor#}
     {% for stu in student %}
{#         if 模板 endif #}
    <tr {% if stu.sex == '' %}style="color:red" {% endif %}>
{#    url模板 传url 和参数#}
       <td ><a href="{% url 'student:detail' stu.id %}">{{ stu.id }}</a></td>
       <td>{{ stu.name}}</td>
       <td>{{ stu.sex|to_male }}</td>
       <td>{{ stu.age }}</td>
      </tr>
     {% endfor %}
</table>
</div>
运行!
开门红 : 报错 自定义过滤器没有注册

解决方案:
settings.py templates:中增加:

定义一个包含标签inclusion_tag
# 定义一个包含标签inclusion_tag def show_list_as_ul(value): # value 接收来自 context的变量 ,前提:注册时 takes_context=True
return {'ls': value} # 将 value 转换成一个ls, 变量传递给 html模板 register.inclusion_tag(name='show_list_as_ul', filename='../templates/show_list_as_ul.html', takes_context=True)
# 接收来自 view 的context变量,用 show_list_as_ul.html模板样式去显示
<!--这 show_as_list 的 inclusion_tag 的模板-->
<ul>
{% for l in ls %} <li>{{ l }}</li> {% endfor %} #ls 变量 来自模板标签
</ul>

使用时在html模板文件上方 {% load filters %}
# 接收来自 views 的 定义方式
def show_list_as_ul(value): # value 接收来自 context的变量
return {'ls': value} # 将 value 转换成一个ls, 变量传递给 模板 register.inclusion_tag(name='show_list_as_ul', filename='show_list_as_ul.html') #我的 html模板放在 app/template下,一开始怎么试都失败...
# 接收来自 view 的context变量,用 show_list_as_ul.html模板样式去显示
后来修改为以下代码:
# 自定义模板标签 和 过滤器 from django.template import Library
from datetime import datetime def to_male(value, arg='zh'):
'''
:param value: 从上下文context中获取值 0为女,1为男
:param arg: 中英文
:return: 性别
'''
dic = {
'zh': ('女', '男'),
'en': ('famle', 'male')
}
return dic[arg][value] register = Library()
register.filter('to_male', to_male) # 自定义简单模板标签
def c_time(format_str='%Y-%m-%d %H:%M:%S'):
now = datetime.now()
return now.strftime(format_str) register.simple_tag(func=c_time, name='c_time') # 自定 简单标签simple_tag 接收 views 中render的 上下文变量 context
# - 把注册器的 takes_context=True,
def c_time2(context): # 第一个参数 必须是 context,名字不能错.
now = datetime.now()
return now.strftime(context['format_str']) # 接收 context['format_str']的值 register.simple_tag(func=c_time2, takes_context=True, name='c_time2') # 自定义 包含标签
# 通过 render 另外一个模板 来展示数据 @register.inclusion_tag('show_list_as_ul.html')
def show_list_as_ul(value): # 接收调用时传递的 模板变量
return {'li': value} #返回 字典 # register.inclusion_tag(filename='show_list_as_ul.html', func=show_list_as_ul, name='show_ul')
成功!
# 自定义 包含标签
# 通过 render 另外一个模板 来展示数据 @register.inclusion_tag('show_list_as_ul.html')
def show_list_as_ul(value, style): # value 接收调用时传递的 模板变量, stlye 给li 的样式
return {'li': value, 'style': style} #返回 字典, 传递style 给 html模板.
#show_list_as_ul.html <ul class="list-group">
<!--li为自定义模板标签传递的 值-->
{% if style == 1 %}
{% for l in li %}<li class="list-group-item">{{ l }}</li>{% endfor %}
{% elif style == 2 %}
{% for l in li %}<li class="list-group-item"><span class="badge">{{ l }}</span> </li>{% endfor %}
{% else %}
{% for l in li %}<a href="#" class="list-group-item active">{{ l }}</a>{% endfor %}
{% endif %}
</ul>
# index.html
<div>
<table class="table">
<tr>
<td>序号</td>
<td>名字</td>
<td>性别</td>
<td>年龄</td>
<td>course</td>
</tr>
{#for 模板 endfor#}
{% for stu in student %}
{# if 模板 endif #}
<tr {% if stu.sex == 0 %}style="color:red" {% endif %}>
{# url模板 传url 和参数#}
<td ><a href="{% url 'student:detail' stu.id %}">{{ stu.id }}</a></td>
<td>{{ stu.name}}</td>
<td>{{ stu.sex|to_male }}</td>
<td>{{ stu.age }}</td>
<td>{% show_list_as_ul stu.course 1 %}</td>
</tr>
{% endfor %}
</table>
</div>
Django 自定义 过滤器和模板标签的更多相关文章
- Django 自定义过滤器和模板标签
		前提:自定义模板标签和过滤器必须位于Django的某个应用中,这个应用可以包含一个templatetags目录, 和models.py views.py 处于同一级目录.若这个templatetags ... 
- django自定义过滤器及模板标签
		创建一个模板库 不管是写自定义标签还是过滤器,第一件要做的事是创建模板库(Django能够导入的基本结构). 创建一个模板库分两步走: 第一,决定模板库应该放在哪个Django应用下. 如果你通过 m ... 
- Django自定义过滤器及标签
		一.自定义过滤器 1.自定义过滤器文件存放位置 在APP应用下创建名为templatetags(该文件夹名固定)的文件包(包含__init__.py文件) 注意APP必须在setting中注册 即在s ... 
- python的Web框架,Django自定义过滤器及标签
		代码布局 有的时候框架给的过滤器不够用,需要自定义一些过滤器,所以就需要我们自己来定义一些过滤器等 自定义代码放置的路径 某个app特用(独有)的 - app 目录下的 templatetags文件夹 ... 
- django自定义过滤器和标签
		1.自定义过滤器和标签的流程: 1.在某个app下创建一个名为templatetags(必需,且包名不可变)的包.假设我们在名为app01的app下创建了一个templatetags的包,并在该包下创 ... 
- django  自定义过滤器(filter)处理较为复杂的变量的实例
		简述:django 在views中有数据需要通过字典(dict)的方式传递给template,该字典中又包含了字典,而且字典中的键值还是一个对象,在template中处理传递过来的数据的时候,字典不能 ... 
- Django自定义过滤器中is_safe和need_autoescape两个参数的理解
		自定义template过滤器的方法参考文档,不再赘述 is_safe 文档说明过滤的两种最终形态,其中一种是设置register.filter(is_safe=True),但是对is_safe的具体作 ... 
- Django 自定义过滤器
		设定自定义过滤器之前要现在配置文件内把自己项目名在 INSTALLED_APPS 内导入 #已安装的django应用 INSTALLED_APPS = [ 'django.contrib.admin' ... 
- Django和Angular.js模板标签冲突的解决方式
		参考文章:http://yanhua365.lofter.com/post/b417f_1f0361 http://stackoverflow.com/questions/8302928/angula ... 
随机推荐
- python中的type
			我们常用type()来查看类型,使用方法如下: 1 a = "zzzq" 2 b = 1 3 c = (1, "zzq123") 4 d = [2, " ... 
- MFC 如何在一个类中使用在其他类中定义的变量或函数
			[声明:本文的知识点来源于网络,参考网址:https://blog.csdn.net/bill_ming/article/details/7407848] [以下三种方法亲测有效,可以根据具体情况来选 ... 
- 转载:return *this和return this
			文章出处,感谢分享http://blog.csdn.net/stpeace/article/details/22220777 别跟我说, return *this返回当前对象, return this ... 
- python 生成器 的send
			>>> def f(): c=yield 5 print c d=yield c+5 print d >>> b=f() >>> b.send(N ... 
- oracle数据库创建并导入dmp文件
			导出:exp userid=xcgwjxuser/xcgwjxuser@orcl file=D:\xcgwjx2014.dmp 导入:imp userid=xcgwjxuser/xcgwjxuser@ ... 
- redistemplate优雅地操作redis  redis 工具类
			参考:https://www.cnblogs.com/superfj/p/9232482.html redis 工具类 package com.service; import org.springfr ... 
- 报表UI测试点
			1.功能完整性:是否实现了产品需求功能 2.数据准确性:UI显示数据,是否与后端传过来的数据一致 3.页面兼容性:浏览器兼容.布局 4.分页查询 5.数据格式一致性:小数精确位.百分比保留位数等 6. ... 
- day04-完整性约束
			完整性约束 关键字: not null 与 default unique primary auto_increment foreign key 1.介绍 约束条件与数据类型的宽度一样,都是可选参数作用 ... 
- html表单中get与post之间的区别
			当用户在 HTML 表单 (HTML Form) 中输入信息并提交之后,有两种方法将信息从浏览器传送到 Web 服务器 (Web Server). 一种方法是通过 URL,另外一种是在 HTTP Re ... 
- 1.ossutil初步使用
			ossutil对应的阿里云参考文档链接地址: https://help.aliyun.com/document_detail/50452.html?spm=a2c4g.11186623.6.1355. ... 
