Django—入门
索引
1.搭建環境
2.創建項目
3.設計模型
4.管理站點
5.視圖及URL
6.模板
?
軟件框架
問題1:什么是軟件框架?
舉個簡單的例子,對于一個公司來說,公司中有各個職能部門,每個部門各司其職,通過部門之間的配合來完成工作,這些部門就形成了一個公司的組織架構。從某種意義上來說,公司就是一種框架。那么對應到軟件設計上來說,軟件框架是由其中的各個模塊組成的,每個模塊負責特定的功能,模塊與模塊之間相互協作來完成軟件開發。
一個公司,它是針對某一市場而成立的,而軟件框架的設計,也是針對某一類軟件問題而設計的,其目的主要是提高軟件開發效率。
MVC簡介
MVC的全拼為Model-View-Controller,最早由TrygveReenskaug在1978年提出,是施樂帕羅奧多研究中心(Xerox PARC)在20世紀80年代為程序語言Smalltalk發明的一種軟件設計模式,是為了將傳統的輸入(input)、處理(processing)、輸出(output)任務運用到圖形化用戶交互模型中而設計的。隨著標準輸入輸出設備的出現,開發人員只需要將精力集中在業務邏輯的分析與實現上。后來被推薦為Oracle旗下Sun公司Java EE平臺的設計模式,并且受到越來越多的使用ColdFusion和PHP的開發者的歡迎。現在雖然不再使用原來的分工方式,但是這種分工的思想被沿用下來,廣泛應用于軟件工程中,是一種典型并且應用廣泛的軟件架構模式。后來,MVC的思想被應用在了Web開發方面,被稱為Web MVC框架。
MVC框架的核心思想是:解耦,讓不同的代碼塊之間降低耦合,增強代碼的可擴展性和可移植性,實現向后兼容。
當前主流的開發語言如Java、PHP、Python中都有MVC框架。
Web MVC各部分的功能
M全拼為Model,主要封裝對數據庫層的訪問,對數據庫中的數據進行增、刪、改、查操作。
V全拼為View,用于封裝結果,生成頁面展示的html內容。
C全拼為Controller,用于接收請求,處理業務邏輯,與Model和View交互,返回結果。
Django簡介
Django,發音為[`d???ɡ??],是用python語言寫的開源web開發框架,并遵循MVC設計。勞倫斯出版集團為了開發以新聞內容為主的網站,而開發出來了這個框架,于2005年7月在BSD許可證下發布。這個名稱來源于比利時的爵士音樂家DjangoReinhardt,他是一個吉普賽人,主要以演奏吉它為主,還演奏過小提琴等。由于Django在近年來的迅速發展,應用越來越廣泛,被著名IT開發雜志SDTimes評選為2013SDTimes100,位列"API、庫和框架"分類第6位,被認為是該領域的佼佼者。Django的主要目的是簡便、快速的開發數據庫驅動的網站。它強調代碼復用,多個組件可以很方便的以"插件"形式服務于整個框架,Django有許多功能強大的第三方插件,你甚至可以很方便的開發出自己的工具包。這使得Django具有很強的可擴展性。它還強調快速開發和DRY(DoNotRepeatYourself)原則。
點擊查看django官方網站
點擊查看django源碼
Django框架遵循MVC設計,并且有一個專有名詞:MVT
MVT各部分的功能
M全拼為Model,與MVC中的M功能相同,負責和數據庫交互,進行數據處理。
V全拼為View,與MVC中的C功能相同,接收請求,進行業務處理,返回應答。
T全拼為Template,與MVC中的V功能相同,負責封裝構造要返回的html。
-
差異就在于黑線黑箭頭標識出來的部分
?
Django1.11文檔? ?https://docs.djangoproject.com/en/1.11/
?
1.搭建環境
安裝Django包(我用的1.11.11)
?
2.創建項目
創建圖書管理項目
?
上去
3.設計模型
模型設計
我們之前操作數據庫是通過寫sql語句,那么能不能不寫sql語句就可以操作數據庫呢? 可以,就是通過接下來要給大家講的ORM框架。
ORM框架
O是object,也就類對象的意思,R是relation,翻譯成中文是關系,也就是關系數據庫中數據表的意思,M是mapping,是映射的意思。在ORM框架中,它幫我們把類和數據表進行了一個映射,可以讓我們通過類和類對象就能操作它所對應的表格中的數據。ORM框架還有一個功能,它可以根據我們設計的類自動幫我們生成數據庫中的表格,省去了我們自己建表的過程。
django中內嵌了ORM框架,不需要直接面向數據庫編程,而是定義模型類,通過模型類和對象完成數據表的增刪改查操作。
使用django進行數據庫開發的步驟如下:
-
1.在models.py中定義模型類
-
2.遷移
-
3.通過類和對象完成數據增刪改查操作
下面我們以保存圖書信息為例來給大家介紹Django中進行數據庫開發的整個流程。
1.定義模型類
模型類定義在models.py文件中,繼承自models.Model類。
說明:不需要定義主鍵列,在生成時會自動添加,并且值為自動增長。
設計圖書類
圖書類:
-
類名:BookInfo
-
圖書名稱:btitle
-
圖書發布日期:bpub_date
模型類的設計
根據設計,在models.py中定義模型類如下:
from django.db import modelsclass BookInfo(models.Model):btitle = models.CharField(max_length=20)bpub_date = models.DateField()2.遷移
遷移前目錄結構如下圖:
遷移由兩步完成:
- 1.生成遷移文件:根據模型類生成創建表的遷移文件。
- 2.執行遷移:根據第一步生成的遷移文件在數據庫中創建表。
生成遷移文件命令如下:
python manage.py makemigrations執行生成遷移文件命令后,會在應用booktest目錄下的migrations目錄中生成遷移文件。
生成遷移文件后的目錄結構:?
打開上圖中的遷移文件,內容如下:?
Django框架根據我們設計的模型類生成了遷移文件,在遷移文件中我們可以看到fields列表中每一個元素跟BookInfo類屬性名以及屬性的類型是一致的。同時我們發現多了一個id項,這一項是Django框架幫我們自動生成的,在創建表的時候id就會作為對應表的主鍵列,并且主鍵列自動增長。
執行遷移命令如下:
python manage.py migrate當執行遷移命令后,Django框架會讀取遷移文件自動幫我們在數據庫中生成對應的表格。
默認生成的表名稱
我們上面生成的表的名字叫做booktest_bookinfo,booktest是應用的名字,bookinfo是模型類的名字。
數據表的默認名稱為:
<app_name>_<model_name> 例: booktest_bookinfo設計英雄類
英雄類:
-
類名:HeroInfo
-
英雄姓名:hname
-
英雄性別:hgender
-
英雄簡介:hcomment
-
英雄所屬圖書:hbook
-
圖書-英雄的關系為一對多
打開booktest/models.py,定義英雄類代碼如下:
class HeroInfo(models.Model):hname = models.CharField(max_length=20)hgender = models.BooleanField()hcomment = models.CharField(max_length=100)hbook = models.ForeignKey('BookInfo')這里要說明的是,BookInfo類和HeroInfo類之間具有一對多的關系,這個一對多的關系應該定義在多的那個類,也就是HeroInfo類中。
hbook = models.ForeignKey('BookInfo')這句代碼就讓BookInfo類和HeroInfo類之間建立了一對多的關系。在我們之后遷移生成表的時候,Django框架就會自動幫我們在圖書表和英雄表之間建立一個外鍵關系。
最后我們可以看到數據庫中生成的英雄表如下圖:
注意上圖中booktest_heroinfo表中有一列hbook_id,這一列名為什么不叫hbook? hbook_id是根據HeroInfo類的關系屬性hbook生成的,對應著圖書表中的主鍵id。
?
上去
4.管理站點
使用Django的管理模塊,需要按照如下步驟操作:
- 1.管理界面本地化
- 2.創建管理員
- 3.注冊模型類
- 4.自定義管理頁面
1.管理界面本地化
本地化是將顯示的語言、時間等使用本地的習慣,這里的本地化就是進行中國化,中國大陸地區使用簡體中文,時區使用亞洲/上海時區,注意這里不使用北京時區表示。
打開settings.py文件,找到語言編碼、時區的設置項,將內容改為如下:
LANGUAGE_CODE = 'zh-hans' #使用中國語言 TIME_ZONE = 'Asia/Shanghai' #使用中國上海時間2.創建管理員
創建管理員的命令如下,按提示輸入用戶名、郵箱、密碼。
python manage.py createsuperuser打開瀏覽器,在地址欄中輸入如下地址后回車。
http://127.0.0.1:8000/admin/如果啟動時出這樣的錯誤,修改端口。
輸入前面創建的用戶名、密碼完成登錄。
登錄成功后界面如下,但是并沒有圖書、英雄的管理入口,接下來進行第三步操作。
?
3.注冊模型類
登錄后臺管理后,默認沒有我們創建的應用中定義的模型類,需要在自己應用中的admin.py文件中注冊,才可以在后臺管理中看到,并進行增刪改查操作。
打開booktest/admin.py文件,編寫如下代碼:
from django.contrib import admin from booktest.models import BookInfo,HeroInfoadmin.site.register(BookInfo) admin.site.register(HeroInfo)到瀏覽器中刷新頁面,可以看到模型類BookInfo和HeroInfo的管理了。
點擊類名稱"BookInfo"可以進入列表頁。
在列表頁中點擊"增加"可以進入增加頁,Django會根據模型類的不同,生成不同的表單控件,按提示填寫表單內容后點擊"保存",完成數據創建,創建成功后返回列表頁。
在列表頁中點擊某行的第一列可以進入修改頁。
?
按照提示進行內容的修改,修改成功后進入列表頁。在修改頁點擊“刪除”可以刪除一項。
刪除:在列表頁勾選想要刪除的復選框,可以刪除多項。
?
點擊執行后進入確認頁面,刪除后回來列表頁面。
4.自定義管理頁面
在列表頁只顯示出了BookInfo object,對象的其它屬性并沒有列出來,查看非常不方便。 Django提供了自定義管理頁面的功能,比如列表頁要顯示哪些值。
打開booktest/admin.py文件,自定義類,繼承自admin.ModelAdmin類。
-
屬性list_display表示要顯示哪些屬性
?
-
修改模型類BookInfo的注冊代碼如下
-
刷新BookInfo的列表頁,所有屬性都顯示出來了
-
最終booktest/admin.py文件代碼如下
?
上去
5.視圖及URL
視圖
對于django的設計框架MVT,用戶在URL中請求的是視圖,視圖接收請求后進行處理,并將處理的結果返回給請求者。
使用視圖時需要進行兩步操作:
* 1.定義視圖函數 * 2.配置URLconf1.定義視圖
視圖就是一個Python函數,被定義在views.py中。
視圖的必須有一個參數,一般叫request,視圖必須返回HttpResponse對象,HttpResponse中的參數內容會顯示在瀏覽器的頁面上。
打開booktest/views.py文件,定義視圖index如下
from django.http import HttpResponsedef index(request):return HttpResponse("index")2.配置URLconf
查找視圖的過程
請求者在瀏覽器地址欄中輸入url,請求到網站后,獲取url信息,然后與編寫好的URLconf逐條匹配,如果匹配成功則調用對應的視圖函數,如果所有的URLconf都沒有匹配成功,則返回404錯誤。
一條URLconf包括url規則、視圖兩部分:
-
url規則使用正則表達式定義。
-
視圖就是在views.py中定義的視圖函數。
需要兩步完成URLconf配置:
-
1.在應用中定義URLconf
-
2.包含到項目的URLconf中
在booktest/應用下創建urls.py文件,定義代碼如下:
from django.conf.urls import url from booktest import views urlpatterns = [url(r'^index$', views.index), ]包含到項目中:打開項目的urls.py文件,為urlpatterns列表增加項如下:
url(r'^book/', include('booktest.urls')),項目/urls.py文件完整代碼如下:
from django.conf.urls import include, url from django.contrib import adminurlpatterns = [url(r'^admin/', include(admin.site.urls)),url(r'^book/', include('booktest.urls')), ]?
也可以直接在項目的urls.py里面直接寫路由,不用在app的url里寫。之后會寫反向解析,這里先不寫了:
from django.conf.urls import url from django.contrib import admin from booktest.views import *urlpatterns = [url(r'^admin/', admin.site.urls),url(r'^index/$', index), ]請求訪問
視圖和URLconf都定義好了,接下來在瀏覽器地址欄中輸入網址:
http://127.0.0.1:8000/book/index網頁顯示效果如下圖,視圖被成功執行了。
上去
6.模板
如何向請求者返回一個漂亮的頁面呢?
肯定需要用到html、css,如果想要更炫的效果還要加入js,問題來了,這么一堆字段串全都寫到視圖中,作為HttpResponse()的參數嗎?這樣定義就太麻煩了吧,因為定義字符串是不會出任何效果和錯誤的,如果有一個專門定義前端頁面的地方就好了。
解決問題的技術來了:模板。
在Django中,將前端的內容定義在模板中,然后再把模板交給視圖調用,各種漂亮、炫酷的效果就出現了。
創建模板
為應用booktest下的視圖index創建模板index.html,目錄結構如下圖:
可以直接在templates下創建index.html文件。
設置查找模板的路徑:打開項目的settings.py文件,設置TEMPLATES的DIRS值
'DIRS': [os.path.join(BASE_DIR, 'templates')],定義模板
打開templtes/booktest/index.html文件,定義<body>里面的代碼如下:
<h1>{{ title }}</h1> {% for li in list %}<li>{{ li }}</li> {% endfor %}在模板中輸出變量語法如下,變量可能是從視圖中傳遞過來的,也可能是在模板中定義的。
{{變量名}}在模板中編寫代碼段語法如下:
{%代碼段%}視圖調用模板
視圖調用模板render。,方法render包含3個參數:
- 第一個參數為request對象
- 第二個參數為模板文件路徑
- 第三個參數為字典,表示向模板中傳遞的上下文數據
打開booktst/views.py文件,調用render的代碼如下:
from django.shortcuts import renderdef index(request):context={'title':'圖書列表','list':range(10)}return render(request,'booktest/index.html',context)頁面效果:
?
轉載于:https://www.cnblogs.com/ForT/p/10710269.html
總結
- 上一篇: 极品飞车14! u9gt2完美全屏运行
- 下一篇: 《钢铁侠3》观后感