溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Django 模板之自定義函數(shù)

發(fā)布時(shí)間:2020-08-05 15:02:11 來(lái)源:網(wǎng)絡(luò) 閱讀:5996 作者:beanxyz 欄目:開(kāi)發(fā)技術(shù)

我們已經(jīng)知道了在Django的模板里面,可以使用for循環(huán),if判斷,接收后臺(tái)的數(shù)據(jù),還可以通過(guò) extends和include來(lái)重復(fù)使用其他的模板,這一節(jié)來(lái)學(xué)習(xí)如何自定義函數(shù)。


模板里面有兩種方式來(lái)自定義函數(shù),分別是simple_tag和 filter方式。


simple_tag:

1 首先在app下創(chuàng)建一個(gè)templatetags的目錄,然后在這個(gè)目錄下面創(chuàng)建一個(gè)py文件,注意這個(gè)目錄的名字是固定的


Django 模板之自定義函數(shù)


2.  然后在這個(gè)py文件里面,導(dǎo)入模板類(lèi),實(shí)例化一個(gè)對(duì)象register,然后執(zhí)行一個(gè)裝飾器simple_tag, 裝飾器下面是自己的函數(shù)


請(qǐng)注意,除了自己寫(xiě)的函數(shù),其余所有這些參數(shù)的名字都是固定的!

__author__ = 'Administrator'
from django import template
from django.utils.safestring import mark_safe
register = template.Library()
@register.simple_tag
def addnum(a1,a2,a3):
    return a1+a2+a3


3. 和數(shù)據(jù)庫(kù)的操作一樣,需要在settings.py里面注冊(cè)這個(gè)app

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01',
]


4. 在要使用的模板文件里面頂部導(dǎo)入我們寫(xiě)的python文件, 就可以調(diào)用了。調(diào)用的時(shí)候空格距離無(wú)所謂

例如

{% load calculation %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>

    <p>
        {% addnum  2  5  6 %}
    </p>
  
</body>
</html>

Django 模板之自定義函數(shù)


第二種定義函數(shù)的方式叫做filter,這個(gè)和Django自帶的函數(shù)使用方式非常類(lèi)似。

首先看幾個(gè)自帶的例子


比如我可以直接傳入一個(gè)字符串,然后通過(guò)管道符號(hào),后面跟一個(gè)字符串的函數(shù)讓他改變大小寫(xiě)或者切片

    <p>
         {{ name }}
    </p>
    <p>
        {{ name|upper }}
    </p>
    <p>
        {{ name|truncatechars:"10" }}
    </p>


如果希望使用類(lèi)似的格式來(lái)調(diào)用自己的函數(shù),我們可以使用filter


filter的步驟和simple_tag非常類(lèi)似。 首先仍然是創(chuàng)建 templatetags目錄,然后創(chuàng)建一個(gè)py文件,然后實(shí)例化一個(gè)register對(duì)象。區(qū)別在于裝飾器不同了,這次是@register.filter


比如

__author__ = 'Administrator'
from django import template
from django.utils.safestring import mark_safe
register = template.Library()
@register.simple_tag
def addnum(a1,a2,a3):
    return a1+a2+a3
@register.filter
def mulnum(a1,a2):
    return a1*a2


接下來(lái)步驟一樣,需要在settings.py里面注冊(cè)app,然后模板文件load這個(gè)py文件,調(diào)用的時(shí)候不是{% 函數(shù)名 參數(shù)1 參數(shù)2 參數(shù)3%} 的格式 而是 {{ 參數(shù)1 | 函數(shù)名:"參數(shù)2"}}

{% load calculation %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <p>
        {% addnum  2  5  6 %}
    </p>
    <p>
         {{ name }}
    </p>
    <p>
        {{ name|upper }}
    </p>
    <p>
        {{ name|truncatechars:"10" }}
    </p>
    {{ 30|mulnum:30 }}
</body>
</html>


結(jié)果如下


Django 模板之自定義函數(shù)


那么,除了格式的區(qū)別,simple_tag和filter還有什么區(qū)別呢? 


  • simple_tag可以使用任何個(gè)數(shù)的參數(shù),而filter只能最多2個(gè)參數(shù)

  • simple_tag不能作為if條件,而filter可以

  • simple_tag后面的參數(shù)直接的空格隨意, filter不能有空格

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI