(一).簡介php
簡介就很少說了,網上的內容一大堆。總結來講,django是走大而全的路線,寫項目超級快,幾乎什麼都爲你考慮到了,你就乖乖照着它的格式來寫就好了。css
這裏來一些基本認知:html
web應用框架(web application framework)是一種開發框架,用來支持動態網站、網絡應用程序以及網絡服務的開發。python
http服務器:用來接受用戶的請求,並將請求轉發給web應用框架進行處理。web應用框架處理完之後再發送給http服務器,http服務器再返回給用戶。web
可是,項目真要作大了,django擴展方面的問題就來了。龐大就會致使臃腫,不易於擴展。不過,就目前學習階段而言,根本不用考慮這麼多。正則表達式
(二).使用哪一個版本?數據庫
學習和開發項目中,必定會使用穩定的版本,也就是LTS(long term support)django
目前學習用的是django1.11.7。因此說,在pip的時候要指定一下版本。即:pip install django==1.11.7編程
(三).注意點ubuntu
若是要使用django2.x版本進行項目,在一些版本較老的ubuntu server上可能會安裝不上。緣由多數是pip的版本太低。
那麼先進行pip升級,在Ubuntu中的命令:sudo pip3 install --upgrade pip
而後再pip安裝django模塊。
1、建立一個django項目
絕大部分的項目都是在Linux上跑的,因此,項目就要放在Linux中。
(一).準備好虛擬環境
進行項目做業的時候,每一個項目所須要的依賴包、環境變量,都有可能不同。你要是在Linux的全局環境中改這個改那個(要知道Linux中軟件之間的相互依賴關係是比較複雜的),要是一個不當心把全局環境搞崩了(你還不知道是何時怎麼把哪一個依賴給搞崩的),而後你修復起來也會感受很崩潰。
好比一個django項目是須要1.11的版本,另外一個django項目要2.0的版本。兩個項目要是同時開搞,難道你在全局環境中來回地pip install django==version_number?pip uninstall django?那麼,虛擬環境就完美地解決了這個問題。並且不少django核心開發者也推薦在虛擬環境中進行項目做業。
每一個虛擬環境都是獨立自主的,多個虛擬環境之間徹底是隔離開的、互不相關。
(1).建立虛擬環境
可參考下列步驟:
# 事先要安裝好python3.6.x # 並將創好這兩個的軟鏈到 /usr/bin/ # 沒有pip3的話 先執行下面這條命令 sudo apt-get install python3-pip # 而後必須更新 sudo pip3 install --upgrade pip sudo pip3 install virtualenv sudo pip3 install virtualenvwrapper # 必需要裝 mkdir ~/.virtualenvs # 建立文件夾 export WORKON_HOME=~/.virtualenvs VIRTUALENVWRAPPER_PYTHON='/usr/bin/python3' source /usr/local/bin/virtualenvwrapper.sh source ~/.bashrc cd .virtualenvs/ # 我本身想要在這個目錄下建虛擬環境,因此cd了 mkvirtualenv venv_djpy virtualenv venv_djpy 試着workon看一下
(2).趕上workon: command not found怎麼辦?
# 須要編輯這個配置文件 vim ~/.bashrc # 把下面三行代碼放進這個配置文件中 export WORKON_HOME=~/.virtualenvs VIRTUALENVWRAPPER_PYTHON='/usr/bin/python3' source /usr/local/bin/virtualenvwrapper.sh # 保存並退出 (Esc -> : -> wq -> 回車) # 重啓配置 source ~/.bashrc
(二).使用命令行的方式建立一個django項目(通用操做,必須得學會)
(1).進入一個python3的虛擬環境。
(2).cd到你放項目的文件夾中。
(3).輸入命令:django-admin startproject 項目的名字。
(4).在本地環境中,建好一個空文件夾,用於等會代碼同步時從虛擬機中下載來的代碼有地方能夠放。
(5).pycharm進行代碼同步設置,而後從Linux上把代碼下載到本地。
注意:代碼同步建議用"Ctrl+s"這個選項。(Always)自動上傳代碼,有很小的概率會使Linux系統崩潰。
(三).使用pycharm的方式(目前本人使用的pycharm版本)
(四).何爲app
一個項目由有許許多多的模塊構成,這些模塊能夠理解成app
(五).建立一個新的app
建完了項目,就能夠在項目中新建app了。
(1).cd到"manage.py"這個文件所在的目錄
(2).敲命令:python manage.py startapp <app_name>
(3)."應用程序"對應於"application","應用"對應於"app"。在通常的Web開發中,這兩者幾乎沒什麼區別。可是在Django中,兩者有一個明顯的區別:application是指一個完整的Web程序,而app是指一個可複用的包,能夠「插入」其餘Django應用程序中。
(六).註冊app
新建一個app以後,必需要把它的名字註冊到"settings.py"的"INSTALLED_APPS"中,否則這個app下面的子路由、模板、自定義過濾器等等,系統都找不到!
(七).修改時區
django1.11.7中,使用的時區是"UTC",也就是"世界標準時間"。目前國際通信系統,如衛星、航空、GPS等等,都採用UTC時間。但其時區上,與GTM一致。
我國在時區上屬於東八區,也就是GTM+8.
想要獲取到本地的時間,就須要在"settings.py"中修改"TIME_ZONE"這個屬性。TIME_ZONE = "UTC" 改爲 TIME_ZONE = "Asia/Shanghai"
2、Django目錄簡介
外層的tk_dj/根目錄是項目的容器。這個目錄的名稱對Django沒有什麼做用,你能夠根據喜愛重命名。
manage.py:管理django項目的工具,一個命令行工具。
__inti__.py:告訴解釋器,這個目錄是python包。
settings.py:配置文件。包含數據庫信息,調試標識,靜態文件等。
urls.py:django項目總url聲明(總路由)。
wsgi.py:部署項目會用到。
3、開啓服務器
別忘了開啓服務!不然連你本身都訪問不到網站。PS:我就犯過這SB錯誤,寫完代碼,直接去瀏覽器刷新了,刷來刷去沒有頁面。一看,服務沒開啓來 [/笑哭]~
(一).第一步(重中之重)
打開settings.py,把ALLOWED_HOSTS = [] 改爲 ALLOWED_HOSTS = ["*"]
項目是部署在Linux上的,只有這樣寫纔可讓windows上的瀏覽器訪問到Linux服務器上的項目。
(二).Linux上的操做步驟
(1).在Linux中,進入"manage.py"這個文件所在的目錄。
(2).輸入代碼:python manage.py runserver 0:8000
其中,0是"0.0.0.0"的縮寫,容許全部的IP都可以訪問。而後,後面加冒號,再跟上端口號。
(3).去瀏覽器的地址欄中,敲入"IP:端口",就能夠訪問了。
注意:若是你的虛擬機是VMware,那麼幾乎不須要端口轉發,在瀏覽器的地址欄中直接鍵入完整的IP。
我用的是VMware,不知道端口轉發該怎麼搞 [/糗]
(三).pycharm中的操做步驟
(四).端口被佔用
(1).若是在pycharm中看到開了兩個,直接關掉其中一個。
(2).看不到的話,去Linux中殺進程。
先敲入:ps -aux | grep manage 看到有哪些進程。
而後通通殺之:kill -s 9 進程ID
4、最基本的視圖函數和路由設置
(一).編寫視圖函數
# hello_django/views.py from django.http import HttpResponse def index(request): return HttpResponse('hello django!')
(二).設置路由
# hello_django/urls.py from django.conf.urls import url from django.contrib import admin from . import views urlpatterns = [ url(r'^admin/$', admin.site.urls), url(r'^hello/$', views.index), ]
備註。脫字符:"^",是以什麼開頭。美圓符:"$",是以什麼結束。
5、urls.py路由用法
(一).URL概念
URL(uniform resource locator)統一資源定位符。說白了,就是網址!
(二).URL格式
例如:https://www.google.com/
(1).格式:schema://host[:port#]/path/.../[?query-string][#anchor]
(2).schema:指定使用的協議(例如:http://,https://,ftp://)
(3).host:http服務器的IP地址或者域名
(4).port:端口號,http默認是80端口
(5).path:訪問資源的路徑
(6).query-string:發送給http服務器的數據
(7).anchor:錨點
(三).urls.py的做用
本質上就是視圖函數的映射列表。告訴django,哪一個url調用哪段代碼。
(四).url解析過程
(1).django傳給url路由要處理的地址,該地址是被去掉端口號以後的第一個"/"的剩餘部分。
例如:http://127.0.0.1:8000/hello/
經處理後的剩餘部分就是:hello/
(2).django會拿着這個剩餘部分的地址,在urlpatterns這個列表裏,從上往下,依次進行正則匹配。
(3).django將會去調用第一個匹配到的視圖。
(五).url示例:
# hello_django/urls.py: from django.conf.urls import include,url from django.contrib import admin from books import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^hello/python/$', views.hello_python), url(r'^hello/php/$', views.hello_php), url(r'^hello/([a-z]+)/$',views.hello_course), url(r'^add/(\d+)/(\d+)/$', views.add), url(r'^hello/(?P<name>\w+)/(?P<num>\d+)$',views.hello_django), ]
# books/views.py from django.http import HttpResponse def hello_python(request): return HttpResponse('Hello python!') def hello_php(request): return HttpResponse('Hello php!') def hello_course(request, course): return HttpResponse('Hello %s' % course) def add(request,a,b): c = int(a)+int(b) return HttpResponse(str(c)) def hello_django(request, name, num): return HttpResponse('Hello %s %s' % (name, num))
(1).位置參數:示例中的 r"^hello/([a-z]+)/$" 以及 r"^hello/(\d+)/(\d+)/$"
在url函數中,正則表達式使用括號"()"進行捕獲參數。
(2).關鍵字參數:示例中的 r"^hello/(?P<name>\w+)/(?P<num>\d+)/$"
在url函數中,正則表達式使用(?P<keyword>)進行捕獲參數。
注意:keyword的命名,必須與它視圖函數中的參數名同樣,否則就會報錯!參數個數要同樣,名字也要同樣!
(3).其餘注意點:
參數類型是字符串類型,因此若是在視圖中要進行數值運算,須要強轉一下。
6、include
(一).做用
方便管理項目。一個項目有一個總urls.py,每一個app中,也建議須要有它本身的urls.py(能夠稱呼「子url」)。只是須要在總urls.py中,使用include()函數進行註冊。
若是一股腦,把全部app的url都放進總urls.py中。先別說app多了,視圖一多,就容易搞混了。
(二).示例
#hello_django/urls.py 主url文件 from django.conf.urls import include,url from django.contrib import admin from .import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^books/',include('books.urls')), ]
#books/urls.py APP books裏面的URL文件 from django.conf.urls import url from . import views urlpatterns = [ url(r'^$',views.index), url(r'article/$', views.article), ]
#book/view.py APP books裏面的view文件 from django.http import HttpResponse def index(request): return HttpResponse('這是首頁') def article(request,): return HttpResponse('這是文章的首頁')
(三).注意事項
(1).總urls.py中,開頭不要加斜槓"/"。由於django已經給域名後面加了一個斜槓,你要是開頭也加個斜槓,url一拼接,就匹配不到了。直接404
(2).總urls.py中,結尾不要加美圓符"$"。美圓符的意義是:以什麼結束。總url都結束了,那麼子url中的urlpatterns還匹配個球呢
(3).總urls.py中,結尾要加斜槓"/"。
(4).子urls.py中,開頭不要加斜槓"/"。同理於(1).
(5).子urls.py中,結尾能夠接美圓符"$"。
7、kwargs的做用
django.conf.urls.url()函數能夠接收第三個可選參數,它必須是一個字典,表示想要傳遞給視圖函數的額外關鍵字參數。
(一) .示例
#hello_django/urls.py 主url文件 from django.conf.urls import include,url from django.contrib import admin from .import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^books/',include('books.urls'),{'switch':'true'}), ]
# book/view.py APP books裏面的view文件 from django.http import HttpResponse import datetime def index(request,**kwargs): if kwargs.get('switch') == 'true': print(datetime.datetime.now()) return HttpResponse('<h1>這是首頁</h1>')
此示例中,kwargs起到了「開關的做用」:當switch爲"true"這個值,在控制檯打印時間(要顯示本地時間須要去setting.py中設置下TIME_ZONE這個屬性)。當switch不爲"true"這個值,就不會打印出時間。
8、name的做用
name參數能夠給url取一個名字。經過給url取名字,之後在這個views或者模版中使用這個url,就只須要經過這個名字就能夠了。
通常用於模版。也可使用reverse進行頁面重定向。
(一).示例
# book/url.py APP books裏面的URL文件 from django.conf.urls import url from . import views urlpatterns =[ url(r'^$',views.index), url(r'article/$', views.article,name='books_article'), url(r'^(?P<books>\w+)/$',views.book_list,name='books_lists'), url(r'^article_new/$', views.article_new,name='books_article_new'), ]
# book/views.py APP book裏面的view文件 from django.shortcuts import render,reverse,redirect from django.http import HttpResponse # Create your views here. def article(request,**kwargs): if kwargs.get('switch') == 'true': return redirect(reverse('book_article_new')) return HttpResponse('這是文章首頁') def article_new(request,**kwargs): return HttpResponse('這是新的文章首頁')
9、模板渲染方式
Django模板是一些文本字符串,做用是把文檔的表現與數據區分開。模板定義一些佔位符和基本的邏輯(模板標籤),規定如何顯示文檔。一般,模板用於生成HTML
(一).setting.py中模版路徑配置
用命令行建項目,沒有"templates"這個文件夾。而這個文件夾是用來存放html頁面的。
既然沒有,那麼就本身手動在項目的根目錄中建立一個名爲"templates"的文件夾(名字切記不要打錯了)。
而後打開"settings.py",把TEMPLATES中的 'DIRS':[] 改爲 'DIRS':[os.path.join(BASE_DIR, "templates")]
(二).在"templates"中,新建html文件
在"templates"中,新建一個與app同名的文件夾,再在其裏面新建html文件。這樣作的好處是,本身不會搞混。頁面多了,若是不歸類,立刻就會把本身搞暈了。
(三).使用render()進行渲染
# books/views.py from django.shortcuts import render def index_3(request): return render(request,'index.html')
注意:render()函數中的第一個參數,必須是request這個請求對象。
(四).去urls.py中進行路由註冊
10、模板變量
(一)語法
兩對花括號包圍的文本,{{variable_name}} 意思是:把指定變量的值插入這裏
Ps:變量名的命名規則與python同樣。
(二).切換模板語言
這樣設置後,只須要寫一個關鍵字,而後按tab鍵,pycharm就會自動幫你補全,省心了不少不少。
(三).示例
{# /templates/books/index.html #} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>首頁</title> </head> <body> 這個變量是字符串對象:{{ books_name}}<br> 這個變量是函數對象:{{ hello}}<br> 這個變量是類方法對象:{{ fruits_say}}<br> 這個變量是類對象:{{ fruits}}<br> 這個變量是類對象,訪問類對象的屬性:{{ fruits.name}}<br> 這個變量是類對象,訪問類對象的方法:{{ fruits.say}}<br> 這個變量是列表對象{{ list }}<br> 這個變量是列表對象,訪問列表的元素{{ list.1 }}<br> 這個變量是字典對象{{ dict }}<br> 這個變量是字典對象,訪問字典的鍵{{ dict.a }}<br> </body> </html>
# books/views.py from django.shortcuts import render def hello(): return 'django' class Fruits: def __init__(self, name, color): self.name = name self.color = color def say(self): return 'HAHAHAHA' ap = Fruits('apple', 'red') ls = ['x', 'y', 'z'] dc = {'a': 1, 'b': 2} def index_5(request): return render( request, 'books/index.html', context={'books_name': 'python', # 字符串 'hello': hello, # 函數 'fruits_say': ap.say, # 方法 'fruits': ap, # 類對象 'list': ls, # 列表 'dict': dc, # 字典 } )
(四).變量和查找
點"."在模板中表示查找。模板看見這個點".",它會按:字典查找、屬性查找、列表索引的進行查找。
(五).不要與python或django關鍵字重名
好比,你來了一個變量:{{data}} 這個變量是一個字典。那麼訪問data.itmes的時候,將會去訪問這個變量中,名爲"items"的鍵。而不是訪問python字典中的items()方法。
11、模板過濾器
(一).語法
例:{{fruits|lower}}
管道符"|"進行鏈式調用,去實現某個功能。
此例中,把fruits對應的字符串,所有轉成小寫。
(二).做用
對變量進行過濾,把處理後的結果展現出來。就像上例,把字符串所有轉成了小寫。
(三).過濾器可使用參數
在過濾器的名稱後面跟上冒號":"再加參數。好比,要把一個字符串中全部的空格去掉,則可使用"cut"過濾器。
{{fruits|cut:' '}}
注意:冒號和參數之間不能有任何空格,必定要緊挨着!
(四).經常使用的過濾器
1、add :字符串相加,數字相加,列表相加,若是失敗,將會返回一個空字符串。 2、default:提供一個默認值,在這個值被django認爲是False的時候使用。好比:空字符串、None。區別於default_if_none,這個只有在變量爲None的時候才使用默認值。 3、first:返回列表中的第一個值。 4、last:返回列表中的最後一個值。 5、date:格式化日期和時間。 6、time:格式化時間。 7、join:跟python中的join同樣的用法。 8、length:返回字符串或者是數組的長度。 9、length_is:字符串或者是數組的長度是不是指定的值。 10、lower:把全部字符串都編程小寫。 11、truncatechars:根據後面給的參數,截斷字符,若是超過了用…表示。 12、truncatewords:同truncatechars,這個是以一個單詞爲單位進行截斷。 以上兩個有xxx_html類型的,針對html,截斷標籤中的字符,而不會截斷標籤。 13、capfirst:首字母大寫。 14、slice:切割列表。用法跟python中的切片操做是同樣的,區間是前閉合後開放。 15、striptags:去掉全部的html標籤。 16、safe:關閉變量的自動轉義 1七、floatformat:浮點數格式化。
(五).date和time過濾格式
Y:四位數的年。如:1999 y:兩位數的年。如:99 m:兩位數的月。如:01,09 n:一位數的月。如:1,9,12 d:兩位數的日。如:01,09,31 j:一位數的日。如:1,9,31 g:12小時制的一位數的小時。如:1,9,12 G:24小時制的一位數小時。如:0,8,23 h:12小時制的兩位數的小時。如:01,09,12 H:24小時制的兩位數的小時。如:01,13,24 i:分鐘。從00-59 s:秒。從00-59
(六).示例
{# /templates/movie/index22.html #} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>home</title> </head> <body> 這是沒作處理的變量:{{ test }}<br> 這是設置了默認值的變量:{{ xx|default:'xxxxxx' }}<br> 這是設置了只有爲None時才使用默認值的變量:{{ xx|default_if_none:'xxxxxx' }}<br> 這是變爲小寫後的變量:{{ test|lower }}<br> 這是先變成小寫再將首字母大寫後的變量:{{ test|lower|capfirst}}<br> 這是兩個數字變量相加:{{ num1|add:num2 }}<br> 這是兩個字符串變量相加:{{ test|add:xx }}<br> 這是列表變量的第一個元素:{{ list|first }}<br> 這是列表變量的最後一個元素:{{ list|last }}<br> 這是默認的data日期時間格式:{{ now|date }}<br> 這是默認的time時間格式:{{ now|time }}<br> 這是data過濾器的年月日24小時制時間格式:{{ now|date:'Y/m/d/H:i:s ' }}<br> 這是time過濾器的年月日12小時制時間格式:{{ now|time:'h:i:s ' }}<br> 這是字符串的join方法:{{ ls|join:'xxx' }}<br> 這是字符串的長度方法:{{ test|length }}<br> 這是列表的長度是否長度爲4:{{ list|length_is:4 }}<br> 這是字符串只顯示4個字符,其他省略(佔3位):{{ test|truncatechars:7 }}<br> 這是字符串只顯示2個單詞,其他省略(不佔位):{{ test|truncatewords:2 }}<br> 這是字符串切片:{{ test|slice:'1:4' }}<br> 這是列表切片:{{ list|slice:':2' }}<br> 這是含html標籤的字符串:{{ html }}<br> 這是去掉字符串中的html標籤:{{ html|striptags }}<br> 這是關掉自動轉義,使字符串中html標籤生效:{{ html|safe }}<br> 這是沒作處理的小數:{{ float }}<br> 這是保留了一位小數:{{ float|floatformat }}<br> 這是保留了兩位位小數:{{ float|floatformat:'2' }}<br> </body> </html>
# movie/views.py from django.shortcuts import render from datetime import datetime ls = ['x', 'y', 'z'] def hello(request): test = 'THIS IS A LIST!' return render( request, 'movie/home.html', context={'test': test, 'xx': '', 'num1': 1, 'num2': 2, 'list': ls, 'now': datetime.now, 'html': '<h1>hello django!!!</h1>', 'float': 3.1415926, } )
12、模板標籤
(一).語法
一對花括號和百分號包圍的文本,{% if xxx %})是模板標籤。標籤的定義至關寬泛:只要能讓模板系統「作些事」的就是標籤。
實際敲代碼的時候,就是在html頁面上寫python代碼(語法很是接近python)。一個標籤能夠輸出內容,做爲控制、循環結構,甚至能夠訪問其餘的模板標籤。
注意事項:標籤要記得關閉!如:{%tag%}{%endtag%} Ps:就像大多數的html代碼那樣,要關閉標籤!
(一).經常使用標籤
(1)if/elif/else:可使用and/or/in/not/==/!=/<=/>=,來進行判斷。ifequal/ifnotequal (2)for…in…:跟python中的for…in…是同樣的用法。 forloop.counter:當前迭代的次數,下標從1開始。 forloop.counter0:當前迭代的次數,下標從0開始。 forloop.revcounter:跟forloop.counter同樣,下標從大到小。 forloop.revcounter0:跟forloop.counter0同樣,下標從大到小。 forloop.first:返回bool類型,若是是第一次迭代,返回true,不然返回false。 forloop.last:返回bool類型,若是是最後一次迭代,返回True,不然返回False。 forloop.parentloop:若是發生多層for循環嵌套,那麼這個變量返回的是上一層的for (3)for…in…empty…:若是沒有數據,跳轉到empty中。 (4)load:加載第三方標籤。最經常使用的是{%load static%} (5)url:返回一個命名了的URL的絕對路徑。 (6)with:緩存一個變量。 (7)autoescape:開啓和關閉自動轉義。
(二).示例
# views.py from django.shortcuts import render def index33(request, name): return render( request, 'book/index33.html', context={'test_name': name, 'list': ls, 'dict': dc, 'html': '<h1>hello django</h1>', } )
{# book/index33.html #} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>hello</title> </head> <body> {% if name == "python" %} 這是python頁面哈哈哈 {% elif name == "django"%} 這是django的頁面嘿嘿嘿 {% else %} 呵呵呵 是{{ name }}的呢.... {% endif %} </body> </html>
# for的使用 {% for i in list %} {% if forloop.counter0 == 0 %} <li>這是一個值:{{ i }}</li> {% else %} <li>{{ i }}</li> {% endif %} {% endfor %}
# url 頁面轉換 # --------------url.py-------------- urlpatterns = [ url(r'^test/$',views.test,name='test'), url(r'^index/([a-z]+)/$',views.index33), url(r'^new/(?P<aaa>\w+)/$',views.new,name='book_new'), ] # --------------hello.html-------------- <a href="/book/test">test測試</a> <br> <a href={% url 'test_alias' %}> test 頁面</a> <a href="{% url 'book_new' 'django' %}">new傳參數</a> <br> # --------------views.py-------------- def test(request): return HttpResponse('test page!!!!!!!') def new(request,aaa): return HttpResponse('這是新的頁面')
# with的使用 {% with test_name as tn %} 11111{{ tn }} <br> 22222 {{ tn }} <br> {% endwith %}
# autoescape的使用 原始的: {{ html }} <br> 過濾器方式: {{ html |safe }} <br> 標籤方式: {% autoescape off %} {{ html }} <br> {% endautoescape %}
十3、模板繼承與引用
模板繼承可讓你建立一個基本的架構
(一).示例
{# templates/music/base.html#} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{% block title %}這是默認標題{% endblock %}</title> </head> <body> {% block content %} 這是默認內容 {% endblock %} <br> {% block demo %} 這是默認演示 {% endblock %} </body> </html>
{# templates/music/ss.html#} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>內容</title> </head> <body> Python學院 web開發django班 </body> </html>
{# templates/music/index.html #} {% extends 'music/base.html' %} {% block title %}music主頁{% endblock %} {% block content %} 這句是經過block.super繼承父類的:{{ block.super }}<br> 這是子模板本身的內容:沒有寫block就不會顯示 {% endblock %} {% block demo %} 這是經過include引用的其餘模板的內容:{% include 'music/ss.html' %} {% endblock %}
二).引用
include標籤能夠包含一個html模板到當前模板中,include標籤是把html模板在此處展開。
(三).注意點
(1).{%extends%}標籤必須在模板的第一行。(放在<!DOCUMENT type>上面一行)
(2).子模板中的全部內容,必須出如今父模板定義好的{%block%}標籤中,不然django不會渲染。
(3).若是在某個block中要使用父模板的內容,使用block.super獲取。(能夠理解成:super().__init__())
十4、模板加載靜態文件
(一).在"settings.py"中添加"STATICFILES_DIRS",設置靜態文件目錄的路徑。(同理於templates)
(二).示例
# /static/js/myjs.js alert('hahahaha'); # -------------------------------- # /static/css/mystyle.css body{ background: skyblue; } #--------------------------------- # /static/image/myimage.jpg ##存入圖片
{# /templates/index.html#} {% load static %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>靜態文件加載</title> </head> <body> <link rel="stylesheet" href="{% static 'css/mystyle.css' %}"> <script src="{% static 'js/myjs.js' %}"></script> 圖片: <img src="{% static 'img/myimage.jpg' %}" alt=""> </body> </html>
十5、自定義過濾器
django已經提供了不少的內置過濾器,不過總有不夠用的時候,那麼就須要你本身定來定義過濾器。
自定義過濾器就是本身編寫帶有參數的python函數。
(一).建一個存放自定義過濾器的python包(實則就是一個文件夾)
這個python包的命名必須是"templatetags",小寫且一個字都不能改。
目錄結構以下圖:
"__init__.py"表示這是一個python包,能夠用來引入,必需要有"__init__.py"這個名字的py文件。
過濾器實則就是一個py文件,在模板中的引入語法:{% load myself_filters %}
(二).實例化註冊類
全部的自定義過濾器、自定義標籤,都必須在這個自定義的py文件中進行註冊。這樣才能在django模板中能夠被使用。
# templatetags/myself_filters.py from django import template register = template.Library()
(三).示例
def mycut(value, arg): """字符替換的自定義過濾器""" return value.replace(arg, '')
{# 在模板頁面上的使用 #} {{ somevariable|mycut:"0" }}
# 註冊自定義過濾器 @register.filter(name='mycut') # 不指定name,函數名就是過濾器的名字 def mycut(value, arg): return value.replace(arg, '')
補充:
(一).遇到須要django支持的時候