真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

django模板&過濾器

django模板&過濾器

聲明:部分信息來源這篇博客https://www.cnblogs.com/maple-shaw/articles/9333821.html

創(chuàng)新互聯(lián)主營濱湖網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,App定制開發(fā),濱湖h5微信小程序搭建,濱湖網(wǎng)站營銷推廣歡迎濱湖等地區(qū)企業(yè)咨詢

MVC:
  • 模型(model)-------->模型
  • 視圖(view)----->html
  • 控制器(controller)--------->業(yè)務(wù)邏輯
Django框架的設(shè)計(jì)模式借鑒了MVC框架的思想,也是分成三部分,來降低各個(gè)部分之間的耦合性。

Django框架的不同之處在于它拆分的三部分為:Model(模型)、Template(模板)和View(視圖),也就是MTV框架。

django模板&過濾器

Django的MTV模式
  • M:(model)模型ORM
  • T:(templates)模板
  • V:(view)業(yè)務(wù)邏輯
   Model(模型):負(fù)責(zé)業(yè)務(wù)對(duì)象與數(shù)據(jù)庫的對(duì)象(ORM)

       Template(模版):負(fù)責(zé)如何把頁面展示給用戶

       View(視圖):負(fù)責(zé)業(yè)務(wù)邏輯,并在適當(dāng)?shù)臅r(shí)候調(diào)用Model和Template

此外,Django還有一個(gè)urls分發(fā)器,它的作用是將一個(gè)個(gè)URL的頁面請(qǐng)求分發(fā)給不同的view處理,view再調(diào)用相應(yīng)的Model和Template
  • Django框架圖示

    django模板&過濾器

django模板
  • 只有兩種特殊符號(hào)

    {{變量}}
    {% 邏輯 %}如for循環(huán)等
  • 注意:當(dāng)模板系統(tǒng)遇到一個(gè)(.)時(shí),會(huì)按照如下的順序去查詢:

    1. 在字典中查詢
    2. 屬性或者方法
    3. 數(shù)字索引
Filters過濾器
Filters過濾器
  • https://docs.djangoproject.com/en/1.11/ref/templates/language/#filters django官方文檔

  • https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#ref-templates-builtins-filters django過濾器官方文檔1

  • 用來修改變量在html的顯示結(jié)果

  • 語法

    語法: {{ 變量(或者字符串等等)|方法名:參數(shù) }}#:前后不可以有空格
    
    default默認(rèn)值過濾器
    {{ 變量|default:"nothing"}}#如果value值沒傳的話就顯示設(shè)置的默認(rèn)值nothing
    注:在setting.py中TEMPLATES的OPTIONS可以增加一個(gè)選項(xiàng):string_if_invalid:'找不到',可以替代default的的作用。
    
    filesizeformat文件尺寸過濾器
    {{ 變量|filesizeformat }}#將值格式化為一個(gè) “人類可讀的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等),最大支持單位pB
    
    add
    {{ 變量|add:"2" }}#給變量加參數(shù),相當(dāng)于py中的加號(hào),可以數(shù)字運(yùn)算,字符串拼接,列表拼接
    
    lower
    {{ 變量|lower }}#小寫
    
    upper
    {{ 變量|upper}}#大寫
    
    title
    {{ 變量|title }}#標(biāo)題
    
    ljust
    {{ 變量|ljust:"10" }}#左對(duì)齊
    
    rjust
    {{ 變量|rjust:"10" }}#右對(duì)齊
    
    center
    {{ 變量|center:"15" }}#居中
    
    length
    {{ 變量|length }}#變量長(zhǎng)度
    
    slice
    {{變量|slice:"2:-1"}}#切片
    
    first
    {{ 變量|first }}#取第一個(gè)元素
    
    last
    {{ 變量|last }}#取最后一個(gè)元素
    
    join
    {{ 變量|join:" // " }}#使用字符串拼接列表。同python的str.join(list)。
    
    truncatechars
    {{ 變量|truncatechars:9}}#如果字符串字符多于指定的字符數(shù)量,那么會(huì)被截?cái)?。截?cái)嗟淖址畬⒁钥煞g的省略號(hào)序列(“...”)結(jié)尾。
    
    date
    {{ 變量|date:"Y-m-d H:i:s"}}#日期格式化
    
    safe
    假如value = "點(diǎn)我"
    {{ 變量|safe}}#Django的模板為了安全會(huì)對(duì)HTML標(biāo)簽和JS等語法標(biāo)簽進(jìn)行自動(dòng)轉(zhuǎn)義,safe能取消django的轉(zhuǎn)義
    
    {% widthratio 100; 1 100%}#先除后乘,需要三個(gè)參數(shù)
    
自定義filter(過濾器)
  • 在app下創(chuàng)建一個(gè)名為templatetags的python包;

  • 在python中創(chuàng)建py文件,文件名自定義(my_tags.py);

  • 在my_tags.py文件中配置

    from django import template#導(dǎo)入模塊
    
    register = template.Library() #標(biāo)準(zhǔn)語句都不能改
    
    #寫函數(shù)裝飾器
    @register.filter
    def add_xx(value, arg):  # 最多有兩個(gè)
    return '{}-{}'.format(value, arg)#返回兩個(gè)值的拼接
    
    #在html使用方式
    {% load my_tags %}#引用模塊
    {{ 'alex'|add_xx:'dsb' }}#通過函數(shù)名使用
    
    @register.filter(name = xxx)#可以直接通過name等于的xxx取引用
    def add_xx(value, arg):  # 最多有兩個(gè)
    return '{}-{}'.format(value, arg)#返回兩個(gè)值的拼接
    
    #在html使用方式
    {% load my_tags %}#引用模塊
    {{'alex'|xxx:'dsb'}}#通過賦值的name引用
  • 自定義過濾器只是帶有一個(gè)或兩個(gè)參數(shù)的Python函數(shù):

    • 變量(輸入)的值 - -不一定是一個(gè)字符串
    • 參數(shù)的值 - 這可以有一個(gè)默認(rèn)值,或完全省略
  • 例如,在過濾器{{var | foo:“bar”}}中,過濾器foo將傳遞變量var和參數(shù)“bar”
Tags標(biāo)簽
  • divisibleby方法可除盡,除盡True,不然False
for循環(huán)
  • for語法

      {% for user in user_list %}
    • {{ user.name }}
    • {% endfor %}
  • for循環(huán)的參數(shù)
VariableDescription
forloop.counter 當(dāng)前循環(huán)的索引值(從1開始)
forloop.counter0 當(dāng)前循環(huán)的索引值(從0開始)
forloop.revcounter 當(dāng)前循環(huán)的倒序索引值(到1結(jié)束)
forloop.revcounter0 當(dāng)前循環(huán)的倒序索引值(到0結(jié)束)
forloop.first 當(dāng)前循環(huán)是不是第一次循環(huán)(布爾值)
forloop.last 當(dāng)前循環(huán)是不是最后一次循環(huán)(布爾值)
forloop.parentloop 本層循環(huán)的外層循環(huán)
  • for... empty

    {% for book in all_books %}
      
        .....
      
    {% empty %}
      沒有相關(guān)的數(shù)據(jù)
    
    {% endfor %}
if判斷
  • dango的if語句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判斷。

  • django的if與python的區(qū)別

    python  10>5>1  -->   10>5  and 5>1   true 
    
    django     10>5>1  -->   10>5  --> true   -->   1>1  false
    • 模板中 不支持連續(xù)連續(xù)判斷 也不支持算數(shù)運(yùn)算(過濾器)
  • 模板的if&elif&else實(shí)例

    {% if user_list %}
    用戶人數(shù):{{ user_list|length }}
    {% elif black_list %}
    黑名單數(shù):{{ black_list|length }}
    {% else %}
    沒有用戶
    {% endif %}
    • 當(dāng)然也可以只有if和else了!?。?!
with定義變量
  • with定義一個(gè)中間變量,在django模板中有些值,需要多次使用,我們就可以通過with定義變量,方便使用

    {% with total=business.employees.count %}
    {#將business.employees.count值定義為total可以在語句內(nèi)使用#}
      {{ total }} employee{{ total|pluralize }}
    {% endwith %}
    {#結(jié)束with語句#}
csrf_token
  • csrf_token標(biāo)簽用于跨站請(qǐng)求偽造保護(hù)。(django的保護(hù)機(jī)制為了防止post請(qǐng)求是從其他端發(fā)送來的,需要一個(gè)認(rèn)證,直接發(fā)送,會(huì)報(bào)403錯(cuò)誤,加入這個(gè)標(biāo)簽代表加入了認(rèn)證方法,就能夠在django中發(fā)送post請(qǐng)求了)

  • 在頁面的form表單里面寫上{% csrf_token %}

    {#在form表單中加入這個(gè)標(biāo)簽,不用注釋中間件也可以發(fā)送(接收)post請(qǐng)求了#} {% csrf_token %}
注釋
  • {# 注釋內(nèi)容 #}

    {#注釋內(nèi)容#}單行注釋,多行就是多敲幾遍

注意事項(xiàng)

    1. Django的模板語言不支持連續(xù)判斷,即不支持以下寫法:

      {% if 10 > 5 > 1 %}
      ...
      {% endif %}
    1. Django的模板語言中屬性的優(yōu)先級(jí)大于方法
    • 如上,我們?cè)谑褂胷ender方法渲染一個(gè)頁面的時(shí)候,傳的字典d有一個(gè)key是items并且還有默認(rèn)的 d.items() 方法,此時(shí)在模板語言中:
    {{ data.items }}
    • 默認(rèn)會(huì)取d的items key的值。
母板
  • 在我們使用django中,往往有很多頁面的代碼效果重復(fù)(公用)的,這是如果網(wǎng)頁格式有新變動(dòng),我們就需要一個(gè)個(gè)修改每個(gè)html的模板,這個(gè)工作起來不僅費(fèi)時(shí),還會(huì)占用一定不必要的資源,這時(shí)我們就需要像面向?qū)ο蟮睦^承思想學(xué)習(xí),將公用的放在一個(gè)統(tǒng)一的html文件中,其他文件繼承這個(gè)html文件,這個(gè)文件我們就稱為母板
  • 注意:我們通常會(huì)在母板中定義頁面專用的CSS塊和JS塊,方便子頁面替換。

  • 子頁面繼承母版,方便使用母版的樣式

    • 在子頁面中在頁面最上方使用下面的語法來繼承母板
    {% extends '母板.html' %}
    {#輸入這個(gè)語句就可以繼承母版.html的樣式 #}
    
    {#通過在母板中使用{% block  xxx %}來定義"塊"。
    在子頁面中通過定義母板中的block名來對(duì)應(yīng)替換母板中相應(yīng)的內(nèi)容。如果不在定義的塊中則不會(huì)出現(xiàn)效果#}
    
    注意在母版中需要定義一個(gè)塊,子網(wǎng)頁的中數(shù)據(jù)寫一個(gè)塊,名稱要與母版的塊名相同才能替換
    
    {#實(shí)例,下面就是我們?cè)诶^承母版的子頁面,定義的塊中,輸入幾條語句#}
    {% block page-main %}
    

    世情薄

    人情惡

    雨送黃昏花易落

    {% endblock %}
組件
  • 組件與母版類似,不同的是,母版比較大,不經(jīng)常變動(dòng),而在網(wǎng)頁中我們有些是需要靈活變動(dòng)的,這時(shí)候我們就需要組件來幫忙了,組件本質(zhì)也是繼承一個(gè)文件,不同的是組件是較少代碼的繼承

  • 繼承組件語法

    {% include '組件.html' %}
靜態(tài)文件(模板標(biāo)簽)
  • 在我們一般時(shí)候中,需要對(duì)靜態(tài)文件設(shè)置一個(gè)別名,才可以使用靜態(tài)文件中的文件等,可如果出現(xiàn),別名被改動(dòng),我們就需要去html中一個(gè)個(gè)修改文件導(dǎo)入的名稱,這樣不夠,于是django替我們想到了這個(gè)情況,我們可以通過下面幾種模板標(biāo)簽方式,避免這種問題

    方式一
    {% load static %}
    {#導(dǎo)入static方法#}
    Hi!  
    {#{% static "images/hi.jpg" %}中的static代表著我們的靜態(tài)文件別名,可以隨著我們的修改動(dòng)態(tài)的變化#}
    
    方式二
    {#使用get_static_prefix#}
    {% load static %}
    Hi!
    {#get_static_prefix代表當(dāng)前的靜態(tài)文件別名,與路徑拼接即可,不過不如方式一方便,不經(jīng)常使用#}
simpletag(自定義模板標(biāo)簽)
  • 和自定義filter類似,只不過能夠接收更靈活的參數(shù)。

    實(shí)例
    定義注冊(cè)simple tag
    
    @register.simple_tag(name="plus")
    def plus(a, b, c):
      return "{} + {} + {}".format(a, b, c)#將傳進(jìn)來的參數(shù)進(jìn)行拼接返回
    
    在模板中使用
    {% load app01_demo %}
    {% plus "1" "2" "abc" %}
inclusion_tag(自定義返回html代碼)
  • 在網(wǎng)頁中我們模板有些樣式是需要跟著服務(wù)端的數(shù)據(jù),靈活變動(dòng)的,這時(shí)我們就需要通過服務(wù)端動(dòng)態(tài)的給模板返回html代碼,這種方式就是inclusion_tag

  • 動(dòng)態(tài)返回分頁數(shù)實(shí)例:

    • 組件
    • 模板
    {% load my_tags %}
    {% page 2 %}
    {#使用inclusion_tag#}
    • inclusion_tag,配置信息
    @register.inclusion_tag('page.html')#返回值返回的頁面
    def page(num):
        return {'num': range(1, num + 1)}#返回的數(shù)據(jù)
    • 實(shí)現(xiàn)網(wǎng)頁引用這個(gè)方法,根據(jù)方法后面?zhèn)魅霐?shù)字的值,顯示多少分頁

    好了,django模板的東西就說到這了,其他沒有說到或遺漏的的,博客內(nèi)有django的官網(wǎng),大家可以去官網(wǎng)具體了解學(xué)習(xí)


分享名稱:django模板&過濾器
鏈接分享:http://weahome.cn/article/jhdsjp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部