代码布局(自定义的代码,放在哪里) 二种方式:
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 自定义 过滤器和模板标签的更多相关文章

  1. Django 自定义过滤器和模板标签

    前提:自定义模板标签和过滤器必须位于Django的某个应用中,这个应用可以包含一个templatetags目录, 和models.py views.py 处于同一级目录.若这个templatetags ...

  2. django自定义过滤器及模板标签

    创建一个模板库 不管是写自定义标签还是过滤器,第一件要做的事是创建模板库(Django能够导入的基本结构). 创建一个模板库分两步走: 第一,决定模板库应该放在哪个Django应用下. 如果你通过 m ...

  3. Django自定义过滤器及标签

    一.自定义过滤器 1.自定义过滤器文件存放位置 在APP应用下创建名为templatetags(该文件夹名固定)的文件包(包含__init__.py文件) 注意APP必须在setting中注册 即在s ...

  4. python的Web框架,Django自定义过滤器及标签

    代码布局 有的时候框架给的过滤器不够用,需要自定义一些过滤器,所以就需要我们自己来定义一些过滤器等 自定义代码放置的路径 某个app特用(独有)的 - app 目录下的 templatetags文件夹 ...

  5. django自定义过滤器和标签

    1.自定义过滤器和标签的流程: 1.在某个app下创建一个名为templatetags(必需,且包名不可变)的包.假设我们在名为app01的app下创建了一个templatetags的包,并在该包下创 ...

  6. django 自定义过滤器(filter)处理较为复杂的变量的实例

    简述:django 在views中有数据需要通过字典(dict)的方式传递给template,该字典中又包含了字典,而且字典中的键值还是一个对象,在template中处理传递过来的数据的时候,字典不能 ...

  7. Django自定义过滤器中is_safe和need_autoescape两个参数的理解

    自定义template过滤器的方法参考文档,不再赘述 is_safe 文档说明过滤的两种最终形态,其中一种是设置register.filter(is_safe=True),但是对is_safe的具体作 ...

  8. Django 自定义过滤器

    设定自定义过滤器之前要现在配置文件内把自己项目名在 INSTALLED_APPS 内导入 #已安装的django应用 INSTALLED_APPS = [ 'django.contrib.admin' ...

  9. Django和Angular.js模板标签冲突的解决方式

    参考文章:http://yanhua365.lofter.com/post/b417f_1f0361 http://stackoverflow.com/questions/8302928/angula ...

随机推荐

  1. jquery轮播图片(无插件简单版)

    轮播图(第三版)[2016-2-26] 工作中用的,改写了半透明蒙版,可以兼容ie7 <script type="text/javascript" src="htt ...

  2. zookeeper(2) zookeeper的核心原理

    zookeeper 的前世今生 分布式系统的很多难题,都是由于缺少协调机制造成的.在分布式协调这块做得比较好的,有 Google 的 Chubby 以及 Apache 的 Zookeeper. Goo ...

  3. koltin语言学习(一)——什么是koltin

    转自:Koltin China (一) 介绍 #Kotlin-for-Android-Dev 1. 什么是Kotlin? Kotlin是JetBrains开发的基于JVM的语言.Kotlin是使用Ja ...

  4. ThinkPHP3.2项目模块结构

    Demo --项目目录 Addons --插件目录 Application --应用模块目录 Admin --后台模块 Common --后台公共函数目录 function.php (可选) Conf ...

  5. 机器学习进阶-项目实战-信用卡数字识别 1.cv2.findContour(找出轮廓) 2.cv2.boudingRect(轮廓外接矩阵位置) 3.cv2.threshold(图片二值化操作) 4.cv2.MORPH_TOPHAT(礼帽运算突出线条) 5.cv2.MORPH_CLOSE(闭运算图片内部膨胀) 6. cv2.resize(改变图像大小) 7.cv2.putText(在图片上放上文本)

    7. cv2.putText(img, text, loc, text_font, font_scale, color, linestick) # 参数说明:img表示输入图片,text表示需要填写的 ...

  6. java byte[]与十六进制字符串相互转换

    http://blog.csdn.net/worm0527/article/details/69939307 http://blog.csdn.net/androiddeveloper_lee/art ...

  7. Druid参考配置

    pom中的maven dependency <dependency>            <groupId>com.alibaba</groupId>       ...

  8. NSMapTable

    跟NSDictionary用法差不多,不过区别是NSMapTable可以设置内存选项,例如可以设置key跟value的内存属性(weak/strong),从而避免内存泄露. 例如这个+ weakToW ...

  9. 一个linux内核模块移植到低版本时发生的异常

    在3.10的内核版本下,有一个运行稳定的内核模块,移植到suse11的时候,编译正常,运行则直接出现crash: <>[ <>[ 503.347300] Modules lin ...

  10. E_FAIL (0x80004005) MachineWrap

    下载VirtualBox-4.3.12-93733-Win.exe,下载地址:http://download.virtualbox.org/virtualbox/4.3.12/