模板語法
CBV源碼剖析
#FBV和CBV
'''
他們兩個都是出現在視圖函數views中的,視圖函數沒必要必須是函數,也可以是一個類,當我們定義一個類的時候就是CBV了,CBV下是通過在類內部定義請求方式的同名函數來進行不同的操作的。
通過對源碼的查看,可以看出其實本質上CBV也是FBV。當請求來的時候會去判斷請求的方式,利用反射去執行定義的相應函數。
'''
# CBV的使用方式:
from django.views import View # 首先需要導入對應的模塊
url(r'^index/', views.MyCBV.as_view()) # as_view()是一個閉包函數
'''
在django啟動的時候,帶括號就會自動觸發執行,as_view()返回其本身內部定義的一個view函數的內存地址,當匹配到路由的時候,就會執行該函數,函數內部的本質就是判斷請求的方式,然后反射到類創建的對象來執行。
'''
看源碼謹記:
- 先從對象自己找,再從產生對象的類中找,之后再去父類中找。
- 看源碼看到了self,要知道該self傳的是什么東東。
模板語法傳值
整理出的規則:
- {{ }}:在前端中一般使用是變量相關
- {% %}:邏輯相關
基本上所有的數據類型都可以傳前端,在前端都可以直接使用{{}}來進行使用,容器類型都只能使用點的方式進行 ,同時還可以使用點索引的方式,兩者還可以混用。
傳遞函數名會自動加括號調用,不過不支持函數傳參數。傳類名的時候也會自動加括號調用進行實例化。
過濾器
過濾器就類似於是模板語法內置的內置語法,最多只能有兩個參數。
# 基本語法
{{ 數據|過濾器:參數}}
# 在寫前端項目的時候,部分前端代碼可以經由后段代碼傳到前端並進行解析。
|safe # 告訴前端這是安全的,然后會解析
# 在后端向前端傳需要導入模塊
from gjango.utils.safestring import mark_safe
res = mark_safe('前端代碼字符串')
統計長度:{{ s|length }}
默認值:{{ s|default:'前面的false才會顯示我' }}
文件大小:{{ f|filesizeformat }}
日期格式化:{{ time|date:'Y-m-d' }}
切片操作(支持步長):{{ l|slice:'0:5:2' }}
切取字符:{{ info|truncatechars:9 }}
切取單詞(按照空格進行切):{{ msg|truncatewords:9 }}
移除特定的字符:{{ msg|cut:'A' }}
拼接操作(可進行數字或者字符串):{{ n|add:10 }}
轉義:{{ hhh|safe }}
轉義:{{ res }}
標簽
# for 循環
{% for foo in l %}
<p>{{ forloop }}</p>
{% empty %}
l是空的時候執行的標簽
{% endfor %}
# if判斷
{% if a %}
標簽體
{% elif s %}
標簽體
{% else s %}
標簽體
{% endif %}
# with起別名
{% with xxx as ooo %}
在這個內部就可以通過別名快速獲取前面的xxx
{% endwith %}
自定義過濾器、標簽和inclusion_tag
'''
首先進行三步:
1. 在應用下創建一個名字叫templatetags文件夾
2. 在該文件夾新愛創建任意名稱的py文件
3. 在py文件中必須書寫下面兩句話:
from django import template
register = template.Library()
接下來就可以進行自定義了
'''
@register.filter(name='過濾器名字')
def my_tag(a):
return XXX
{% load py文件 %}
{{ s|過濾器名字}}
# 自定義標簽(參數可以有多個) 相當於函數
@register.simple_tag(name='標簽名')
def index(a,b):
return '1,2,3'
使用{% 標簽名 參數 %} # 多個參數之間使用空格
# 自定義 inclusion_tag
'''
在html頁面的某一個地方的頁面需要傳參數才能渲染出來,並且在多個頁面都要使用,那么就可以考慮將該局部頁面做成inclusion_tag形式
其原理就是先定義一個方法,在頁面上調用該方法並傳值,該方法會傳一些數據給html頁面,然后將渲染好的結果放到調用的位置
'''
@register.inclusion_tag('html頁面')
def left(n):
data = XXX
return locals() # 推薦是想用這一種
return {'data':data}
{% left 5 %} # 使用
模板的繼承
當某些頁面只需要局部進行更改而整體不會進行改變的時候,就可以使用模板的繼承
步驟如下:
-
創建一個html文件,將之全部內容刪除。
-
{% extends '繼承的頁面模板' %}
-
{% block content %}
模板內容{% endblock%}
在模板頁面找到需要進行修改的內容
-
在子頁面對區域進行更改
{% block content %}
子頁面內容{% endblock%}
一般情況新愛模板頁面應該至少有三塊被修改的區域
- css區域
- html區域
- js區域
{% block css %}
{% endblock %}
{% block content %}
{% endblock %}
{% block js %}
{% endblock %}
模塊的導入
加入某一個局部使用較多的話 可以當做模塊進行導入
{% incluse '模塊文件' %}
