Django之模板層
阿新 • • 發佈:2020-10-10
模版語法傳值
{{}}:變數相關
{%%}:邏輯相關
def index(request): # 模版語法可以傳遞的後端python資料型別 n = 123 f = 11.11 s = '我也想奔現' b = True l = ['小紅','姍姍','花花','茹茹'] t = (111,222,333,444) d = {'username':'jason','age':18,'info':'這個人有點意思'} se = {'晶晶','洋洋','嚶嚶'} def func(): print('我被執行了') return '你的另一半在等你' class MyClass(object): def get_self(self): return 'self' @staticmethod def get_func(): return 'func' @classmethod def get_class(cls): return 'cls' # 物件被展示到html頁面上 就類似於執行了列印操作也會觸發__str__方法 def __str__(self):return '到底會不會?' obj = MyClass() # return render(request,'index.html',{}) # 一個個傳 return render(request,'index.html',locals()) <p>{{ n }}</p> <p>{{ f }}</p> <p>{{ s }}</p> <p>{{ b }}</p> <p>{{ l }}</p> <p>{{ d }}</p> <p>{{ t }}</p> <p>{{ se }}</p> <p>傳遞函式名會自動加括號呼叫 但是模版語法不支援給函式傳額外的引數:{{ func }}</p> <p>傳類名的時候也會自動加括號呼叫(例項化){{ MyClass }}</p> <p>內部能夠自動判斷出當前的變數名是否可以加括號呼叫 如果可以就會自動執行 針對的是函式名和類名</p> <p>{{ obj }}</p> <p>{{ obj.get_self }}</p> <p>{{ obj.get_func }}</p> <p>{{ obj.get_class }}</p> # django模版語法的取值 是固定的格式 只能採用“句點符” .<p>{{ d.username }}</p> <p>{{ l.0 }}</p> <p>{{ d.hobby.3.info }}</p> # 即可以點鍵也可以點索引 還可以兩者混用
過濾器(過濾器只能最多有兩個引數)
# 過濾器就類似於是模版語法內建的 內建方法 # django內建有60多個過濾器 我們不需要學這麼多 瞭解10個左右就差不多了 後面碰到了再去記憶 # 基本語法 {{資料|過濾器:引數}}或
{{obj|filter__name:param}} 變數名字|過濾器名稱:變數
# 轉義 # 前端 |safe # 後端 from django.utils.safestring import mark_safe res = mark_safe('<h1>新新</h1>') """ 以後你在全棧專案的時候 前端程式碼不一定非要在前端頁面書寫 也可以現在先在後端寫好 然後傳遞給前端頁面 """ <h1>過濾器</h1> <p>統計長度:{{ s|length }}</p> <p>預設值(第一個引數布林值是True就展示第一個引數的值否在展示冒號後面的值):{{ b|default:'啥也不是' }}</p> <p>檔案大小:{{ file_size|filesizeformat }}</p> <p>日期格式化:{{ current_time|date:'Y-m-d H:i:s' }}</p> <p>切片操作(支援步長):{{ l|slice:'0:4:2' }}</p> <p>切取字元(包含三個點):{{ info|truncatechars:9 }}</p> <p>切取單詞(不包含三個點 按照空格切):{{ egl|truncatewords:9 }}</p> <p>切取單詞(不包含三個點 按照空格切):{{ info|truncatewords:9 }}</p> <p>移除特定的字元:{{ msg|cut:' ' }}</p> <p>拼接操作:{{ l|join:'$' }}</p> <p>拼接操作(加法):{{ n|add:10 }}</p> <p>拼接操作(加法):{{ s|add:msg }}</p> <p>轉義:{{ hhh|safe }}</p> <p>轉義:{{ sss|safe }}</p> <p>轉義:{{ res }}</p>
標籤
# for迴圈 {% for foo in l %} <p>{{ forloop }}</p> <p>{{ foo }}</p> 一個個元素 {% endfor %} {'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 6, 'revcounter0': 5, 'first': True, 'last': False} # if判斷 {% if b %} <p>baby</p> {% elif s%} <p>都來把</p> {% else %} <p>老baby</p> {% endif %} # for與if混合使用 {% for foo in lll %} {% if forloop.first %} <p>這是我的第一次</p> {% elif forloop.last %} <p>這是最後一次啊</p> {% else %} <p>{{ foo }}</p> {% endif %} {% empty %} <p>for迴圈的可迭代物件內部沒有元素 根本沒法迴圈</p> {% endfor %} # 處理字典其他方法 {% for foo in d.keys %} <p>{{ foo }}</p> {% endfor %} {% for foo in d.values %} <p>{{ foo }}</p> {% endfor %} {% for foo in d.items %} <p>{{ foo }}</p> {% endfor %} # with起別名 {% with d.hobby.3.info as nb %} <p>{{ nb }}</p> 在with語法內就可以通過as後面的別名快速的使用到前面非常複雜獲取資料的方式 <p>{{ d.hobby.3.info }}</p> {% endwith %}
自定義過濾器、標籤、inclusion_tag
""" 先三步走 1.在應用下建立一個名字”必須“叫templatetags資料夾 2.在該資料夾內建立“任意”名稱的py檔案 eg:mytag.py 3.在該py檔案內"必須"先書寫下面兩句話(單詞一個都不能錯) from django import template register = template.Library() """ # 自定義過濾器 @register.filter(name='baby') def my_sum(v1, v2): return v1 + v2 # 使用 {% load mytag %} <p>{{ n|baby:666 }}</p> # 自定義標籤(引數可以有多個) 類似於自定義函式 @register.simple_tag(name='plus') def index(a,b,c,d): return '%s-%s-%s-%s'%(a,b,c,d) # 使用 標籤多個引數彼此之間空格隔開 <p>{% plus 'jason' 123 123 123 %}</p> # 自定義inclusion_tag """ 內部原理 先定義一個方法 在頁面上呼叫該方法 並且可以傳值 該方法會生成一些資料然後傳遞給一個html頁面 之後將渲染好的結果放到呼叫的位置 """ @register.inclusion_tag('left_menu.html') def left(n): data = ['第{}項'.format(i) for i in range(n)] # 第一種 # return {'data':data} # 將data傳遞給left_menu.html # 第二種 return locals() # 將data傳遞給left_menu.html {% left 5 %} # 總結:當html頁面某一個地方的頁面需要傳引數才能夠動態的渲染出來,並且在多個頁面上都需要使用到該區域性 那麼就考慮將該區域性頁面做成inclusion_tag形式 (在講bbs的時候會使用到)
模版的繼承
""" 你們有沒有見過一些網站 這些網站頁面整體都大差不差 只是某一些區域性在做變化 """ # 模版的繼承 你自己先選好一個你要想繼承的模版頁面 {% extends 'home.html' %} # 繼承了之後子頁面跟模版頁面長的是一模一樣的 你需要在模版頁面上提前劃定可以被修改的區域 {% block content %} 模版內容 {% endblock %} # 子頁面就可以宣告想要修改哪塊劃定了的區域 {% block content %} 子頁面內容 {% endblock %} # 一般情況下模版頁面上應該至少有三塊可以被修改的區域 1.css區域 2.html區域 3.js區域 {% block css %} {% endblock %} {% block content %} {% endblock %} {% block js %} {% endblock %} # 每一個子頁面就都可以有自己獨有的css程式碼 html程式碼 js程式碼 """ 一般情況下 模版的頁面上劃定的區域越多 那麼該模版的擴充套件性就越高 但是如果太多 那還不如自己直接寫 """
模版的匯入
""" 將頁面的某一個區域性當成模組的形式 哪個地方需要就可以直接匯入使用即可 """ {% include 'wasai.html' %}
三種編碼方式傳資料
######1 三種編碼格式 # def home(request): # return render(request,'home.html') # def index(request): # # 接收urlencoded編碼 # # print(request.POST) # # # 接收form-data編碼 # #資料部分 # # print(request.POST) # # #檔案部分 # # print(request.FILES) # # # 接收json格式 # # 這裡沒有 # print(request.POST) # # 資料在這(自行處理) # print(request.body) # # # return HttpResponse('ok')