1. 程式人生 > >django 自定義模板過濾器

django 自定義模板過濾器

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 自定義模板過濾器