中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

django模板&過濾器

發布時間:2020-05-22 17:51:07 來源:網絡 閱讀:692 作者:小飛額 欄目:編程語言

django模板&過濾器

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

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

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

django模板&過濾器

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

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

       View(視圖):負責業務邏輯,并在適當的時候調用Model和Template

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

    django模板&過濾器

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

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

    1. 在字典中查詢
    2. 屬性或者方法
    3. 數字索引
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的顯示結果

  • 語法

    語法: {{ 變量(或者字符串等等)|方法名:參數 }}#:前后不可以有空格
    
    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" }}#給變量加參數,相當于py中的加號,可以數字運算,字符串拼接,列表拼接
    
    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}}#如果字符串字符多于指定的字符數量,那么會被截斷。截斷的字符串將以可翻譯的省略號序列(“...”)結尾。
    
    date
    {{ 變量|date:"Y-m-d H:i:s"}}#日期格式化
    
    safe
    假如value = "<a href='#'>點我</a>"
    {{ 變量|safe}}#Django的模板為了安全會對HTML標簽和JS等語法標簽進行自動轉義,safe能取消django的轉義
    
    {% widthratio 100; 1 100%}#先除后乘,需要三個參數
    
自定義filter(過濾器)
  • 在app下創建一個名為templatetags的python包;

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

  • 在my_tags.py文件中配置

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

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

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

    {% for book in all_books %}
      <tr>
        .....
      </tr>
    {% empty %}
      <td colspan="5" >沒有相關的數據</td>
    
    {% endfor %}
if判斷
  • dango的if語句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判斷。

  • django的if與python的區別

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

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

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

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

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

    {#注釋內容#}單行注釋,多行就是多敲幾遍

注意事項

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

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

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

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

  • 繼承組件語法

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

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

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

  • 動態返回分頁數實例:

    • 組件
    <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)}#返回的數據
    • 實現網頁引用這個方法,根據方法后面傳入數字的值,顯示多少分頁

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

向AI問一下細節

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

AI

聊城市| 行唐县| 德昌县| 炎陵县| 彩票| 张家口市| 呼伦贝尔市| 泉州市| 霍州市| 运城市| 巴青县| 鲁甸县| 浙江省| 老河口市| 天长市| 松桃| 广德县| 白朗县| 东兰县| 赤壁市| 西畴县| 侯马市| 锡林浩特市| 云南省| 同德县| 遵化市| 长治市| 东辽县| 象山县| 五原县| 麻阳| 邢台市| 马公市| 富平县| 福州市| 阳山县| 县级市| 石景山区| 奎屯市| 天峨县| 正蓝旗|