Django 過濾器


過濾器 描述 示例
upper 以大寫方式輸出 {{ user.name | upper }}
add 給value加上一個數值 {{ user.age | add:”5” }}
addslashes 單引號加上轉義號  
capfirst 第一個字母大寫 {{ ‘good’| capfirst }} 返回”Good”
center 輸出指定長度的字符串,把變量居中 {{ “abcd”| center:”50” }}
cut 刪除指定字符串 {{ “You are not a Englishman” | cut:”not” }}
date 格式化日期  
default 如果值不存在,則使用默認值代替 {{ value | default:”(N/A)” }}
default_if_none 如果值為None, 則使用默認值代替  
dictsort 按某字段排序,變量必須是一個dictionary {% for moment in moments | dictsort:”id” %}
dictsortreversed 按某字段倒序排序,變量必須是dictionary  
divisibleby 判斷是否可以被數字整除
{{ 224 | divisibleby:2 }}  返回 True
escape 按HTML轉義,比如將”<”轉換為”&lt”  
filesizeformat 增加數字的可讀性,轉換結果為13KB,89MB,3Bytes等
{{ 1024 | filesizeformat }} 返回 1.0KB
first 返回列表的第1個元素,變量必須是一個列表  
floatformat 轉換為指定精度的小數,默認保留1位小數 {{ 3.1415926 | floatformat:3 }} 返回 3.142  四舍五入
get_digit 從個位數開始截取指定位置的數字 {{ 123456 | get_digit:’1’}}
join 用指定分隔符連接列表 {{ [‘abc’,’45’] | join:’*’ }} 返回 abc*45
length 返回列表中元素的個數或字符串長度  
length_is 檢查列表,字符串長度是否符合指定的值 {{ ‘hello’| length_is:’3’ }}
linebreaks 用<p>或<br>標簽包裹變量 {{ “Hi\n\nDavid”|linebreaks }} 返回<p>Hi</p><p>David</p>
linebreaksbr 用<br/>標簽代替換行符  
linenumbers 為變量中的每一行加上行號  
ljust 輸出指定長度的字符串,變量左對齊 {{‘ab’|ljust:5}}返回 ‘ab   ’
lower 字符串變小寫  
make_list 將字符串轉換為列表  
pluralize 根據數字確定是否輸出英文復數符號  
random 返回列表的隨機一項  
removetags 刪除字符串中指定的HTML標記 {{value | removetags: “h1 h2”}}
rjust 輸出指定長度的字符串,變量右對齊  
slice 切片操作, 返回列表 {{[3,9,1] | slice:’:2’}} 返回 [3,9]
{{ 'asdikfjhihgie' | slice:':5' }} 返回 ‘asdik’
slugify 在字符串中留下減號和下划線,其它符號刪除,空格用減號替換
{{ '5-2=3and5 2=3' | slugify }} 返回 5-23and5-23
stringformat 字符串格式化,語法同python  
time 返回日期的時間部分  
timesince 以“到現在為止過了多長時間”顯示時間變量 結果可能為 45days, 3 hours
timeuntil 以“從現在開始到時間變量”還有多長時間顯示時間變量  
title 每個單詞首字母大寫  
truncatewords 將字符串轉換為省略表達方式
{{ 'This is a pen' | truncatewords:2 }}返回
This is ...
truncatewords_html 同上,但保留其中的HTML標簽
{{ '<p>This is a pen</p>' | truncatewords:2 }}返回
<p>This is ...</p>
urlencode 將字符串中的特殊字符轉換為url兼容表達方式 {{ ‘http://www.aaa.com/foo?a=b&b=c’ | urlencode}}
urlize 將變量字符串中的url由純文本變為鏈接  
wordcount 返回變量字符串中的單詞數  
yesno 將布爾變量轉換為字符串yes, no 或maybe
{{ True | yesno }}
{{ False | yesno }}
{{ None | yesno }}
返回 
yes
no 
maybe

 

自定義過濾器:

第一步: 在app目錄下創建包 templatetags

在templatetags下創建py文件,文件名隨意,比如

自定義simple_tag, 不能在模板中使用if判斷
from django import template
from django.utils.html import format_html
import datetime

register = template.Library()

@register.simple_tag
def page_cut(current_page, loop_page):
    #分頁: 固定顯示前后5頁
    differ = abs(current_page - loop_page)
    if differ < 5:
        li = '''<li class=""><a href="?page=%s">%s<span class="sr-only">(current)</span></a></li>''' % (loop_page, loop_page)
        return format_html(li)
    else:
        #這里一定要返回一個空字符串,否則在前端會顯示一系列的None
        return ''

 

自定義過濾器函數filter

因為sample_tag不能使用if判斷,所以才有了它

最多只能有兩個參數,一個是變量值,一個是選項值

from django import template
from django.utils.html import format_html
import datetime

register = template.Library()

@register.filter
def time_color(exp_date):
    #給一個月內到期的html標簽加上class屬性
    startdate = datetime.datetime.now().date()
    enddate = startdate + datetime.timedelta(30)
    if (enddate - exp_date).days > 0 and (enddate - exp_date).days <= 30:
        td = '''<td class="%s">%s</td>''' % ('exp_date', exp_date)
        return format_html(td)
    elif (enddate - exp_date).days > 30:
        td = '''<td class="outof">%s</td>''' % (exp_date)
        return format_html(td)
    else:
        td = '''<td>%s</td>''' % (exp_date)
        return format_html(td)

第二步,html引用

在文件開頭導入

{% load my_page %}

使用

<tbody>
        {% for project in projects_list %}
        <tr>
            <td><a href="{% url 'projects_detail' project.id %}">{{ project.com_name }}</a></td>
            <td>{{ project.name}}</td>
            <td>{{ project.domain }}</td>
            <td>{{ project.get_status_display }}</td>
            {{ project.exp_date|time_color }}
            <td>{{ project.ftp }}</td>
        </tr>
        {% endfor %}
    </tbody>
<!-- 頁碼導航 -->
<nav>
  <ul class="pagination">
    {% if projects_list.has_previous %}
        <li class=""><a href="?page={{ projects_list.previous_page_number }}" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>
    {% endif %}

    {% for page_num in projects_list.paginator.page_range %}
     {% if page_num == projects_list.number %}
        <li class="active"><a href="?page={{ page_num }}">{{ page_num }}<span class="sr-only">(current)</span></a></li>
     {% else %}
         #分頁標簽
        {% page_cut projects_list.number page_num %}
     {% endif %}
    {% endfor %}

    {% if projects_list.has_next %}
        <li class=""><a href="?page={{ projects_list.next_page_number }}" aria-label="Previous"><span aria-hidden="true">&raquo;</span></a></li>
    {% endif %}
  </ul>
</nav>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM