日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Web框架之Django_04 模板层了解(过滤器、标签、自定义过滤器、标签、inclusion_tag、模板的继承与导入)

發布時間:2024/9/30 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Web框架之Django_04 模板层了解(过滤器、标签、自定义过滤器、标签、inclusion_tag、模板的继承与导入) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

閱讀目錄

  • 一、模板語法:
  • 二、過濾器:(Filters)
  • 三、模板的繼承與模板的導入

摘要:

模版層(模板語法)

  • 模板語法
  • 過濾器
  • 標簽
  • 自定義過濾器、標簽
  • inclusion_tag
  • 模板的繼承
  • 模板的導入

一、模板語法:

常用語法:

{{ }} 變量相關
{% %} 邏輯相關

變量:

在Django中的模板語言用{{ 變量名 }}來使用變量,而這個變量的來源通常是在視圖函數里面產生的,通過render方法返回到前端,前端通過此語法來使用該變量。
后端向前端頁面傳遞數據的方式:

-------------------------------------------------------------------- 注:如果你對python感興趣,我這有個學習Python基地,里面有很多學習資料,感興趣的+Q群:895817687 --------------------------------------------------------------------# 第一種: return render(request,'index.html',{'n':n}) # 第二種: return render(request,'index.html',locals()) # 將當前所在的名稱空間中的名字全部傳遞給前端頁面

后端的傳遞的數據類型可以是:int、str、list、dict、tuple、set、function…
傳遞的變量命名規則:包括任何字母數字以及下劃線 ("_")的組合, 變量名稱中不能有空格或標點符號。
模板語法規定:使用句點符(就是點號:.)來取出變量中的相關數據,比如字典、列表、元祖、屬性方法(對象)
這里還需要強調一點:模板語法是不支持傳參的。
模板中支持的寫法:

后端:views.py l = [1,2,3,4,5,user_obj] user_obj = models.Book.object.filter(id=1).first() d = {'name': 'sgt', 'password': '123'}前端:使用模板語法,來處理后端傳遞過來的變量{# 取l中的第一個參數 #} {{ l.0 }} {# 取字典d中相應的值 #} {{ d.name }} {{ d.keys }} {{ d.values }} {{ d.items }}{# 取對象的name屬性 #} {{ user_obj.name }}{# .操作只能調用不帶參數的方法 #} {{ l.5.name }}{% with l.5.name as h %} {{ h }} {% endwith %} {# 將 l.5.name找到的數據起名為h,這樣就可以通過h這個名字得到 l.5.name的值 #}

這里特別來說說把
函數:

后端: def func():return '你調用了我?'前端: {{ func }}顯示結果:你調用了我?在前端調用后端的函數名(當然此函數名肯定在locals()里面)時,會調用該函數(函數名加括號),得到函數調用的返回值,如果無返回值則為None

類:

后端class Demo(object):def __init__(self, name):self.name = namedef func(self):return self.name@classmethoddef test(cls):return 'cls'@staticmethoddef foo(name,age):return 'static_foo'obj = Demo('sgt') <app01.views.ttt.<locals>.Demo object at 0x0000024052F39898> cls sgt sgt

如果類里面加入:

def __str__(self):return 'Sgt帥得一塌糊涂!'

那么{{ obj }}的結果就會變成:Sgt帥得一塌糊涂!(因為__str__會攔截打印動作,在前端{{ obj }}實際上就是類似于打印obj.

二、過濾器:(Filters)

1:常用過濾器介紹:
在Django的模板語言中,通過使用 過濾器 來改變變量的顯示。

過濾器的語法: {{ value|filter_name:參數 }}

使用管道符"|"來應用過濾器。
這里的過濾的意思實際上個人認為概念很模糊,過濾器的意思是將變量通過使用后端的方法將變量進行相關操作加工邏輯處理的封裝之后拿到前端去使用的一種過程實現。
例如:{{ name|lower }}會將name變量應用lower過濾器之后再顯示它的值。lower在這里的作用是將文本全都變成小寫。
注意事項:
##過濾器支持鏈式操作,即一個過濾器的輸出結果作為另一個過濾器的輸入
##過濾器可以接收參數,例如:{{ sss|truncatewords:30 }},這將顯示sss的前30個詞。
##過濾器參數包含空格的話,必須用引號包裹起來,比如使用逗號和空格去連接一個列表中的元素,如:{{ list|join:’, ’ }}
##管道符‘|’左右沒有空格。一定要注意,沒有空格
Django的模板語言中提供了大約六十個內置過濾器。這里主要拿出一些常見的方法來介紹:
#default
如果一個變量是false或空,使用給定的默認值,否則使用該變量的值。

{{ value|default:"nothing"}} 如果value沒有傳值或者值為空的話就顯示nothing

#length
返回值的長度,作用于字符串和列表

{{ value|length }}后端: s = 'what f**k!' l = ['a', 'b', 4, 5, 8]前端: {{ l|length }} {{ s|length }}顯示結果:5 10

#filesizeformat
將值格式化為一個可理解的文件大小單位(13kb,4m)

{{ value|filesizeformat }}后端: n = 102478450前端: {{ n|filesizeformat }}顯示結果:97.7 MB

#slice 切片(顧頭不顧尾)

{{value|slice:"開始索引:結束索引:步長"}}后端: s = 'what f**k!' l = ['a', 'b', 4, 5, 8]前端: {{ l|slice:'1:4' }} {{ s|slice:'5:9' }} {{ l|slice:'2:-1' }} <!--從索引2開始切,切到索引為-1的位置為結尾,同時顧頭不顧尾-->顯示結果: ['b', 4, 5] f**k [4, 5]

#date 時間格式化輸出

{{ value|date:"Y-m-d H:i:s"}}后端: import datetime ctime = datetime.datetime.now()前端: {{ ctime }} {{ ctime|date:'Y-m-d H:i:s' }}顯示結果: June 11, 2019, 2:51 p.m. 2019-06-11 14:51:24

#safe

Django的模板中會對HTML標簽和JS等語法標簽進行自動轉義,原因顯而易見,這樣是為了安全。但是有的時候我們可能不希望這些HTML元素被轉義,比如我們做一個內容管理系統,后臺添加的文章中是經過修飾的,這些修飾可能是通過一個類似于FCKeditor編輯加注了HTML修飾符的文本,如果自動轉義的話顯示的就是保護HTML標簽的源文件。為了在Django中關閉HTML的自動轉義有兩種方式,如果是一個單獨的變量我們可以通過過濾器“|safe”的方式告訴Django這段代碼是安全的不

后端: value = "<a href='https://www.cnblogs.com/suguangti/'>點我</a>"前端: {{ value }} {{ value|safe }}結果: <a href='https://www.cnblogs.com/suguangti/'>點我</a> 點我下面那個‘點我’在頁面上是一個a標簽,點擊可跳轉

上面的safe是在前端取消轉義,后端取消轉義方法如下:

from django.utils.safestring import mark_safe xxx = mark_safe('<h1>我是h1標簽</h1>')

#truncatechars
如果字符串字符多于指定的字符數量,那么會被截斷,截斷的剩余字符將用省略號結尾表示。
參數:截斷的字符數(包含三個點)

后端: ss = 'abcdefghijklmnopqrstuvwxyz'前端: {{ ss|truncatechars:10 }}結果:(注意...也算進長度里了) abcdefg...

#truncatewords
以一個單詞為一個元素,單詞與單詞之間的空格為區分依據,將一定數量的單詞進行截斷,截斷后面的用…表示
一個單詞加上一個空格 計數一個

后端: sss = "Life was like a box of chocolates you never know what you're gonna get."前端: {{ sss|truncatewords:7 }}顯示結果: Life was like a box of chocolates ... (注意chocolates后面有個空格)

#cut

移除變量中所有的指定相同的字符串

{{ value|cut:' ' }}后端: ssss = 'you do bb now,bb is not good thing, why do you bb for too many times!'前端: {{ ssss|cut:'bb' }}顯示結果: you do now, is not good thing, why do you for too many times!

#join
將列表中的元素用指定字符連接起來

后端 ll = [1, 2, 3, 4, 5]前端 {{ ll|join:'@' }}結果 1@2@3@4@5

標簽介紹:
#for循環(內部有個empty判斷,詳見下面if判斷示例)

后端 ll = [1, 2, 3, 4, 5]前端 {% for foo in ll %}<p>{{ foo }}</p> {% endfor %}結果顯示: 1 2 3 4 5

forloop的使用:

后端 ll = [1, 2, 3, 4, 5]前端 {% for foo in ll %}<p>{{ forloop }}</p> {% endfor %}


forlop里面有幾個屬性需要我們注意,比如 counter0,counter,first,last它們對應的值在for循環過程中的開始和結束是不一樣的
#if 判斷

{% for foo in l %} if else{% if flag %}<p>flag不為空</p>{% else %}<p>flag是空</p>{% endif %}{#(l = ['a', 'b', 'c', 'd', 'e'])#} {% for foo in l %}{% if forloop.first %}<p>這是我的第一次</p>{% elif forloop.last %}<p>這是最后一次了啊</p>{% else %}<p>嗨起來!!!</p>{% endif %}{% empty %} <!--如果l = [],上面的for循環不會進行,只會走這一步--><p>你給我的容器類型是個空啊,沒法for循環</p> {% endfor %} l = ['a', 'b', 'c', 'd', 'e'] 這是我的第一次 嗨起來!!! 嗨起來!!! 嗨起來!!! 這是最后一次了啊l = [] 你給我的容器類型是個空啊,沒法for循環

自定義過濾器/標簽/inclusion_tag:

必須做的三件事
1.在應用名下新建一個名為templatetags文件夾(必須叫這個名字)
2.在該新建的文件夾內新建一個任意名稱的py文件
3.在該py文件中需要固定寫下面兩句代碼
①這里在app01項目程序文件夾新建templatetags文件夾,在此文件夾內新建一個mine.py文件,打開mine.py文件>>輸入:

from django import template register = template.Library()# 自定義過濾器 @register.filter(name='my_filter') def index(a, b):return a*b# 自定義標簽: @register.simple_tag def plus(a, b, c):return a+b+c

②前端html文件內使用過濾器或者標簽:
{% load mine %}
{{ 9|my_filter:11 }}
{% my_tag 1 2 3 %}
顯示的結果:

{% load mine %}
{{ 9|my_filter:11 }}
{% my_tag 1 2 3 %}

顯示的結果:

99
6

自定義inclusion_tag

inclusion_tag的作用:創建一個動態的html頁面文件a.html,這個頁面文件a可以在另外一個頁面b中被調用,實現這個頁面a應該有的功能。比如:
在上面的mine.py文件中創建inclusion_tag:

# mine.py文件 創建inclusion_tagfrom app01 import models from django import template register = template.Library()@register.inclusion_tag('inclusion_t_test.html', name='my_inclusion') def func():book_list = models.Book.objects.all()return {'list': book_list} #將book_list的QuerySet對象列表傳進inclusion_t_test.html文件

inclusion_t_test.html文件里面:

<!-- inclusion_t_test.html文件,被導入的html文件--> <table><thead><tr><th>id</th><th>title</th><th>price</th></tr></thead><tbody>{% for obj in list %}<tr><td>{{ obj.id }}</td><td>{{ obj.title }}</td><td>{{ obj.price }}</td></tr>{% endfor %}</tbody> </table>

調用的html頁面文件:

{% load mine %}
{% my_inclusion %}

三、模板的繼承與模板的導入

模板的繼承:
繼承的概念我們都知道:在類里面是直接可以使用基類中的屬性和方法,也就是直接能用,不需要自己再寫的意義。
而模板的繼承:我們需要使用一個網頁中一些固定不變的部分,再不用再自己寫或者復制的前提下,只需要寫幾段代碼就能拿來在一個新的網頁使用,就像一個模板,模板中變化的地方我們自己指定,其他地方不變,值只變化我們指定的地方。
實現過程:
首先需要在被繼承的模板中劃分多個區域,這些區域是我們能的可變動區

{% block 給區域起的名字 %}{% endblock %}<!--通常情況下一個模板中應該至少有三塊--> {% block css %}頁面css代碼塊 {% endblock %}{% block js %}頁面js代碼塊 {% endblock %}{% block content %}頁面主體內容 {% endblock %}

子板繼承模板:

{#先繼承模板所有的內容#}{% extends 'home.html' %}{#然后根據block塊的名字修改指定區域的內容#}{% block content %}<h1>登錄頁面</h1><form action=""><p>username:<input type="text" class="form-control"></p><p>password:<input type="text" class="form-control"></p><input type="submit" class="btn btn-success"></form>{% endblock %}


如果在一個block模板中需要保留原始的內容則可以在這個block中任意你想要的位置添加一個{{ block.super }},就可以保留原內容

  • 模板的導入 將一段html當做模塊的方式導入到另一個html展示

    {% include ‘想導入的html文件名’ %}

  • 模板導入與自定義inclusion_tag的區別:模板導入的頁面內容是靜態的、不變的,而通過自定義inclusion_tag導入的頁面文件可以是動態的,可動性自己掌控。

    補充:靜態文件配置

    {% load static %} <link rel='stylesheet' href="{% static 'css/mycss.css'%}"> # 第一種方式<link rel='stylesheet' href="{% get_static_prefix %}css/mycss.css"> # 第二種方式

    總結

    以上是生活随笔為你收集整理的Web框架之Django_04 模板层了解(过滤器、标签、自定义过滤器、标签、inclusion_tag、模板的继承与导入)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。