django 自定义模板过滤器

参考:http://www.cnblogs.com/qwj-sysu/p/4246605.html

做的页面,一个tr里有两个td, 1、3、5等奇数数据要放在第一个td, 2、4、6等偶数数据要放在第二个td, (如果已经没有数据,td 内容要为空), 所以要根据取余数的结果来判断; 但django的模板没有取余操作,只好自定义一个

django的模板配置在:setting.py

TEMPLATES = [

{

‘BACKEND‘: ‘django.template.backends.django.DjangoTemplates‘,

一、后端

自定义标签和过滤器必须依赖于一个django app,也就是说,自定义标签和过滤器是绑定app的。该app应该包含一个templatetags目录,这个目录一个和model.py,views.py在同一个层级,记得在该目录下建立一个__init__.py文件一遍django知道这是一个python包。在该目录下,你可以新建一个python模块文件,文件名不要和其他app中的冲突就好。例如:

promotions

migrations

templatetags

__init__.py

get_mod.py

__init__.py

models.py

views.py

get_mod.py

# -*- coding:utf-8 -*-

from django import template

register = template.Library()

@register.filter

def get_mod(arg1,arg2):

return arg1%int(arg2)

自定义过滤器就是接受一个或者连个参数的python函数。例如{{var | foo:"bar"}},过滤器foo接受变量var和参数bar。

如果前端为

{{ forloop.counter|get_mod:"2" }}

则为get_mod(arg1,arg2)

如果前端为

{{ forloop.counter|get_mod }}

则为 get_mod(arg1)

二、前端

<table style="background-color:#ffffff;margin-top:30px;width:80%;" class="ke-zeroborder" border="0" cellspacing="50" bordercolor="#000000" cellpadding="0" align="center">
             <tbody>
{#                因一行有两列,所以根据取余数的结果来判断是放在第一个td还是第二个td,如果余数是1,放在第一个td,如果是2,放在第二个td;如果已经没有数据,td 内容要为空#}
               {% load get_mod %}
               {% for product in product_dict.ring %}

{% if forloop.counter|get_mod:"2" == 1  %}
                   <tr>
                       <td style="border-bottom:#ccc 1px solid;text-align:center;border-top:#ccc 1px solid;">
                         <p>
                           <a href="{{ products.4 }}"><img src="/static/promotions/{{ product.0 }}" /></a>
                         </p>
                         <p>
                           {{ forloop.counter|get_mod:"2" }}{{ product.1 }}
                           <span style="text-align:center;white-space:normal;background-color:#FFFFFF;">(</span><span style="text-align:center;white-space:normal;background-color:#FFFFFF;color:#E53333;">已锁定</span><span style="text-align:center;white-space:normal;background-color:#FFFFFF;">)</span>
                         </p>
                         <p class="MsoNormal">
                           ¥&nbsp;<span style="line-height:1.5;font-size:12px;">{{ product.3 }}</span>
                         </p>
                       </td>
                 {% elif empty %}
                       <td>
                           <p></p>
                       </td>
                       </tr>
                 {% else %}
                       <td style="border-bottom:#ccc 1px solid;text-align:center;border-top:#ccc 1px solid;">
                         <p>
                           <a href="{{ product.4 }}"><img src="/static/promotions/{{ product.0 }}" /></a>
                         </p>
                         <p>
                           {{ product.1 }}(<span style="text-align:center;white-space:normal;background-color:#FFFFFF;color:#E53333;">已锁定</span>)
                         </p>
                         <p class="MsoNormal">
                           ¥&nbsp;<span style="line-height:1.5;font-size:12px;">{{ product.3 }}</span>
                         </p>
                       </td>
                   </tr>
                 {% endif %}
               {% endfor %}
           </tbody>
       </table>

注意:

{% load %}load的是模块名,而不是app名

forloop

forloop.counter 表示循环的次数,它从1开始计数

forloop.counter0 表示循环的次数,它从0开始计数

forloop.revcounter表示循环中剩下的items数量,第一次循环时设为items总数,最后一次设为1

forloop.revcounter0类似于forloop.revcounter,但它是表示的数量少一个,即最后一次循环时设为0

forloop.first当第一次循环时值为True,在特别情况下很有用:

{% for object in objects %}

{% if forloop.first %}<li class="first">{% else %}<li>{% endif %}

{{ object }}

</li>

{% endfor %}

forloop.last当最后一次循环时值为True

{% for link in links %}{{ link }}{% if not forloop.last %} | {% endif %}{% endfor %}

forloop.parentloop在嵌套循环中表示父循环的forloop:

{% for country in countries %}

<table>

{% for city in country.city_list %}

<tr>

<td>Country #{{ forloop.parentloop.counter }} </td>

<td>City #{{ forloop.counter }}</td>

<td>{{ city }}</td>

</tr>

{% endfor %}

</table>

{% endfor %}

时间: 2024-10-10 11:56:20

django 自定义模板过滤器的相关文章

django 第五课自定义模板过滤器与标签

代码布局:(自定义的代码放在哪里) 某个app特有的 app目录下,templatetags文件夹需要放 __init__.py 在到templetags文件夹下创建python模块(py文件) 定义复用 创建要给新的app,将他们定义在新的app中,在INSTALL_APPS 注册,然后可以应用 自定义模板过滤器 模板过滤器是什么? 函数,一个或两个参数 第一个参数是传递进来的模板变量 第二个参数,普通的参数,也可以是默认也可以不要其实就是个函数,没有什么不同在app目录teacher下创建t

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

1.创建一个模板库 使用模板过滤器的时候,直接把过滤器写在app里,例如:在app里新建一个templatetags的文件夹,这个目录应当和 models.py . views.py 等处于同一层次.例如: books/     __init__.py     models.py     templatetags/     views.py 在 templatetags 中创建两个空文件:一个 __init__.py (告诉Python这是一个包含了Python代码的包)和一个用来存放你自定义的

Django——模板层(template)(模板语法、自定义模板过滤器及标签、模板继承)

阅读目录(Content) 模板语法之变量 模板之过滤器 default length filesizeformat date slice truncatechars safe 模板之标签 自定义标签和过滤器 模板继承 (extend) 模板语法之include 前言:当我们想在页面上给客户端返回一个当前时间,一些初学者可能会很自然的想到用占位符,字符串拼接来达到我们想要的效果,但是这样做会有一个问题,HTML被直接硬编码在 Python代码之中. 1 2 3 4 def current_dat

DJANGO之自定义模板过滤器

我查找了DJANGO模板的过滤器,好像指定字符串包含指定关-键字符的过滤器没有呢, 没有硬着头-皮,按网上其它人的作法,写了一个,成功了...:) 参考URL: http://liuzhijun.iteye.com/blog/1884630 http://www.xxx.com/html/2013/pythonweb_1017/588.html templatetags目录下的deploy_filter.py文件如下: #!/usr/bin/env python # coding:utf-8 f

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

inclusion_tag() 在app中新建一个templatetags包(名字固定,不能变,只能是这个), 和views.py.models.py等文件处于同一级别目录下. 这是一个包!不要忘记创建__init__.py文件以使得该目录可以作为Python的包 1.首先,编写Python函数,templatetags/my_tags.py from django import template register = template.Library() register = Library(

Django自定义模板函数

https://www.cnblogs.com/SunsetSunrise/p/7680491.html 在django中新建一个应用:listpage在listpage中新建templatetags文件夹在templatetags文件夹中新建XX.py文件在XX.py中写入: from django import template register = template.Library() @register.simple_tag() def YY(a,b): return a+b 在模板文件

Django中模板过滤器总结

一.形式:小写: {{ name | lower }} 二.串联:先转义文本到HTML,再转换每行到 <p> 标签: {{ my_text|escape|linebreaks } 三.过滤器的参数 显示前30个字:{{ bio | truncatewords:"30" }} 格式化:{{ pub_date | date:"F j, Y" }} 过滤器列表:{{ 123|add:"5" }} 给value加上一个数值 {{ "

django 常用 模板过滤器

控制HTML转义,参数是:on 或 off.效果和使用safe或escape过滤器相同. {% autoescape on %} {{ body }} {% endautoescape %} {{ value|default:"(N/A)" }} 值不存在,使用指定值 {{ value|default_if_none:"(N/A)" }} 值是None,使用指定值 {{ 列表变量|dictsort:"数字" }} 排序从小到大 {{ 列表变量|d

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

创建一个模板库 不管是写自定义标签还是过滤器,第一件要做的事是创建模板库(Django能够导入的基本结构). 创建一个模板库分两步走: 第一,决定模板库应该放在哪个Django应用下. 如果你通过 manage.py startapp 创建了一个应用,你可以把它放在那里,或者你可以为模板库单独创建一个应用. 我们更推荐使用后者,因为你的filter可能在后来的工程中有用. 无论你采用何种方式,请确保把你的应用添加到 INSTALLED_APPS 中. 我们稍后会解释这一点. 第二,在适当的Dja