django 自定义模板过滤器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 %} 


以上是关于django 自定义模板过滤器的主要内容,如果未能解决你的问题,请参考以下文章

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

django 的模板语言template ,自定义过滤器,自定义标签,模板继承

以变​​量为参数的 django 自定义模板过滤器

“模板语法错误:过滤器无效:”;基于 django 文档的自定义 django 模板过滤器损坏,但模板标签有效

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

Django之Django模板自定义过滤器