Django之模板&靜態(tài)文件(二)

  • 自定義過濾器
    DTL模板語言生來只是為了方便的展示信息,所以與編程語言相比顯得有點薄弱,有時候不能滿足我們的需求。因此django提供了一個接口,讓開發(fā)者能自定義標簽和過濾器,使顯示達到自己想要的內(nèi)容或者格式。
  1. 首先,你需要添加一個templatetags的文件夾, 自定義過濾器必須處在已經(jīng)安裝了的app中的一個名叫”templatetags”的包(文件夾)中。因此可以有兩種選擇:
    1) 一種是放在其他已經(jīng)安裝了的app中。這種方式簡單,但不方便管理。
    2)單獨創(chuàng)建一個app,用來存放所有的自己定義的過濾器。
    templatetags 文件夾名字不能修改,這是django規(guī)定的。
    比如,用pycharm中Tools->Run manage.py Task命令startapp utils創(chuàng)建app,然后再下面建立python包templatetags,pycharm創(chuàng)建文件夾時,不會自動上傳所以需要upload到遠程服務(wù)器上去, 創(chuàng)建完templatetags模塊后,重啟服務(wù)器。
    image.png
  2. 使用自定義過濾器,必須把對應(yīng)的app加載,在settings中添加該app


    image.png
  3. 在templatetags下添加一個python文件,如我這里創(chuàng)建一個custom.py文件,在文件中添加對應(yīng)的自定義過濾器
# 過濾器文件中custom.py:
# -*- coding: utf-8 -*-
from django import template
# 將注冊類實例化為register對象
# register = template.Library() 創(chuàng)建一個全局register變量,它是用來注冊你自定義標簽和過濾器的,只有向系統(tǒng)注冊過的tags,系統(tǒng)才認得你。
# register 不能做任何修改,一旦修改,該包就無法引用
register = template.Library()
# 使用裝飾器注冊自定義過濾器
@register.filter
def certificateNoFilter(val, args = 18): #將身份證從倒數(shù)第二個反過來6個數(shù)替換為*
    # val: 代表管道符左邊的參數(shù), 是必須的, 因為自定義過濾器必須使用在變量上,所以必須要
    # args: 可配置的,如果有其它的參數(shù),就代表你需要輸入一個值
    return val[:11] + "******" + val[-1]

  1. 將過濾器加載到html, 使用自定義的過濾器
#應(yīng)用urls.py
url(r'^test/',include('TestApp.urls'))

#應(yīng)用views.py
# -*- coding: utf-8 -*-
class Custom(View):
    def get(self,request):
        name = '菜鳥突擊隊'
        certificateno = '430224189009104236'
        #如果不想指定鍵值,可以使用locals(),locals()指獲取當前能獲取到的變量,形成一個字典
        return render(request,'custom.html',locals())

#custom.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自定義過濾器</title>
</head>
<body>
姓  名:{{name}}<br/>
身份證:{{ certificateno }}<br/>
用*代替之后的:
{# 加載過濾器所在的文件名,由于templatetags的文件名是固定的,django可以直接找到過濾器文件所在的位置 #}
{% load customFilter %}
{{ certificateno|certificateNoFilter }}
</body>
</html>

效果:
image.png
  • 自定義簡單標簽
#使用裝飾器注冊自定義標簽
@register.simple_tag
def curr_date(args):#args可傳參數(shù),根據(jù)實際需求而定
    return datetime.datetime.now().strftime(args)
<h3>自定義標簽</h3>
時間日期:{% curr_date "%Y-%m-%d"%}
  • 自定義包含標簽
    一種比較普遍的tag類型是只是渲染其它模塊顯示下內(nèi)容,這樣的類型叫做Inclusion Tag。 常用的模板標簽是通過渲染 其他 模板顯示數(shù)據(jù)的。
    我們使用include標簽時,如果引入的html代碼中需要傳入變量,則需要在所引入的view視圖中獲取變量,如果引入的html代碼中的變量是一個公共變量,則需要重復(fù)獲取N次,使用自定義包含標簽,可以在定義文件中獲取一次即可
#使用裝飾器注冊自定義包含標簽
@register.inclusion_tag('my_menu.html') #將返回值傳給my_menu.html去
def my_menu():
    menus = ['首頁','項目實戰(zhàn)','每日一練']
    return {'menus':menus}

my_menu.html

<body>
--------------菜單欄--------------
<br/>
{% for menu in menus %}
    {{menu}}
{% endfor %}
</body>
</html>

custom.html

<h3>自定義包含標簽</h3>
{% my_menu %}

代碼示例:
custom.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自定義過濾器</title>
</head>
<body>
<h3>自定義過濾器</h3>
姓  名:{{name}}<br/>
身份證:{{ certificateno }}<br/>
用*代替之后的:
{# 加載過濾器所在的文件名,由于templatetags的文件名是固定的,django可以直接找到過濾器文件所在的位置 #}
{% load custom %}
{{ certificateno|certificateNoFilter }}
<br/>
<h3>自定義標簽</h3>
時間日期:{% curr_date "%Y-%m-%d"%}

<h3>自定義包含標簽</h3>
{% my_menu %}
</body>
</html> 

custom.py:

# -*- coding: utf-8 -*-
from django import template
import datetime

# 將注冊類實例化為register對象
# register = template.Library() 創(chuàng)建一個全局register變量,它是用來注冊你自定義標簽和過濾器的,只有向系統(tǒng)注冊過的tags,系統(tǒng)才認得你。
# register 不能做任何修改,一旦修改,該包就無法引用
register = template.Library()
# 使用裝飾器注冊自定義過濾器
@register.filter
def certificateNoFilter(val, args = 18): #將身份證從倒數(shù)第二個反過來6個數(shù)替換為*
    # val: 代表管道符左邊的參數(shù), 該值是必須的, 因為自定義過濾器必須使用在變量上,所以必須要有一個val
    # args: 可配置的,如果有其它的參數(shù),就代表你需要輸入一個值
    return val[:11] + "******" + val[-1]

#使用裝飾器注冊自定義標簽
@register.simple_tag
def curr_date(args):#args可傳參數(shù),根據(jù)實際需求而定
    return datetime.datetime.now().strftime(args)

#使用裝飾器注冊自定義包含標簽
@register.inclusion_tag('my_menu.html') #將返回值傳給my_menu.html去
def my_menu():
    menus = ['首頁','項目實戰(zhàn)','每日一練']
    return {'menus':menus}

views.py:

class Custom(View):
    def get(self,request):
        name = '菜鳥突擊隊'
        certificateno = '430224189009104236'

        #如果不想指定鍵值,可以使用locals(),locals()指獲取當前能獲取到的變量,形成一個字典
        return render(request,'custom.html',locals())

my_menu.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>自定義包含標簽</title>
</head>
<body>
--------------菜單欄--------------
<br/>
{% for menu in menus %}
    {{menu}}
{% endfor %}
</body>
</html>

靜態(tài)文件

  • 模板加載靜態(tài)文件
  1. 在項目添加一個靜態(tài)文件夾,并添加需要添加的靜態(tài)文件(一般名叫static)


    image.png
  2. 將新建立的文件夾引入,配置靜態(tài)文件settings
STATICFILES_DIRS = [os.path.join(BASE_DIR),'static']

3.頁面引入:

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src = "{% static '/js/test.js' %}"></script>
    <link type="text/css" rel="stylesheet" href="{% static '/css/test.css' %}"/>
</head>
<body>
<p>
    引入靜態(tài)文件標簽
</p>
</body>
</html>

注意:

  1. 某些應(yīng)用提供自定義標簽和過濾器庫. 要在一個模板中訪問它們, 使用 {% load %} 標簽:
    當你載入一個自定義標簽或過濾器庫,只有當前模板可以使用這些標簽/過濾器 — 繼承鏈中不論是父模板還是子模板都不能使用使用這些標簽和過濾器。即哪個頁面需要使用,就在哪個頁面單獨加載,不能通過繼承模板方式獲得。
  2. 只要templatetags所在位置是settings.py中INSTALLED_APPS中配置過的,或是在TEMPLATE_DIRS配置過的,任意一個位置便可以。
    一定記得要在templatetags文件夾中包含init.py文件??瘴募憧?。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,715評論 19 139
  • 點我查看本文集的說明及目錄。 本項目相關(guān)內(nèi)容( github傳送 )包括: 實現(xiàn)過程: CH1 創(chuàng)建一個博客應(yīng)用 ...
    學(xué)以致用123閱讀 4,656評論 0 31
  • 版權(quán): https://github.com/haiiiiiyun/awesome-django-cn Aweso...
    若與閱讀 23,628評論 3 240
  • 那一年因腰腿疼痛,腰椎間盤突出我做了微創(chuàng)手術(shù),事實上當時都是在可做可不做的狀態(tài),醫(yī)生說也可以先保守觀察,可是我義無...
    唐惠娟閱讀 504評論 0 7
  • 你說,相處不累最重要。 我竟無言以對,好吧,我們不合適。 你說你是不離不棄,但是你現(xiàn)在人呢? 他說,你相信一見鐘情...
    若是愛已不可為閱讀 113評論 0 1

友情鏈接更多精彩內(nèi)容