模型 視圖(view)..."/>
溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

django模板&過濾器

發(fā)布時間:2020-05-22 17:51:07 來源:網(wǎng)絡 閱讀:686 作者:小飛額 欄目:編程語言

django模板&過濾器

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

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

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

django模板&過濾器

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

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

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

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

    django模板&過濾器

django模板
  • 只有兩種特殊符號

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

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

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

  • 在my_tags.py文件中配置

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

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

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

    {% for book in all_books %}
      <tr>
        .....
      </tr>
    {% empty %}
      <td colspan="5" >沒有相關的數(shù)據(jù)</td>
    
    {% 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ù)運算(過濾器)
  • 模板的if&elif&else實例

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

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

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

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

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

注意事項

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

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

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

    • 在子頁面中在頁面最上方使用下面的語法來繼承母板
    {% extends '母板.html' %}
    {#輸入這個語句就可以繼承母版.html的樣式 #}
    
    {#通過在母板中使用{% block  xxx %}來定義"塊"。
    在子頁面中通過定義母板中的block名來對應替換母板中相應的內(nèi)容。如果不在定義的塊中則不會出現(xiàn)效果#}
    
    注意在母版中需要定義一個塊,子網(wǎng)頁的中數(shù)據(jù)寫一個塊,名稱要與母版的塊名相同才能替換
    
    {#實例,下面就是我們在繼承母版的子頁面,定義的塊中,輸入幾條語句#}
    {% block page-main %}
    <p>世情薄</p>
    <p>人情惡</p>
    <p>雨送黃昏花易落</p>
    {% endblock %}
組件
  • 組件與母版類似,不同的是,母版比較大,不經(jīng)常變動,而在網(wǎng)頁中我們有些是需要靈活變動的,這時候我們就需要組件來幫忙了,組件本質(zhì)也是繼承一個文件,不同的是組件是較少代碼的繼承

  • 繼承組件語法

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

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

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

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

    • 組件
    <nav aria-label="Page navigation">
        <ul class="pagination">
            <li>
                <a href="#" aria-label="Previous">
                    <span aria-hidden="true">?</span>
                </a>
            </li>
    
            {% for i in num %}
             <li><a href="#">{{ i }}</a></li>
            {% endfor %}
    
            <li>
                <a href="#" aria-label="Next">
                    <span aria-hidden="true">?</span>
                </a>
            </li>
        </ul>
    </nav>
    • 模板
    {% 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ù)
    • 實現(xiàn)網(wǎng)頁引用這個方法,根據(jù)方法后面?zhèn)魅霐?shù)字的值,顯示多少分頁

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

向AI問一下細節(jié)

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

AI