一荒叼、MVC/MTV介紹
MVC的全拼為Model-View-Controller轿偎。
MVC框架的核心思想是:解耦,讓不同的代碼塊之間降低耦合被廓,增強(qiáng)代碼的可擴(kuò)展性和可移植性坏晦,實(shí)現(xiàn)向后兼容。
Web MVC各部分的功能:
- M全拼為Model嫁乘,主要封裝對(duì)數(shù)據(jù)庫(kù)層的訪問(wèn)昆婿,對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行增、刪蜓斧、改仓蛆、查操作历谍。
- V全拼為View逾冬,用于封裝結(jié)果,生成頁(yè)面展示的html內(nèi)容浦旱。
-
C全拼為Controller直奋,用于接收請(qǐng)求能庆,處理業(yè)務(wù)邏輯,與Model和View交互脚线,返回結(jié)果搁胆。
MVT各部分的功能:
- M全拼為Model,與MVC中的M功能相同邮绿,負(fù)責(zé)和數(shù)據(jù)庫(kù)交互渠旁,進(jìn)行數(shù)據(jù)處理。
- V全拼為View斯碌,與MVC中的C功能相同一死,接收請(qǐng)求,進(jìn)行業(yè)務(wù)處理傻唾,返回應(yīng)答投慈。
-
T全拼為Template,與MVC中的V功能相同冠骄,負(fù)責(zé)封裝構(gòu)造要返回的html伪煤。
差異就在于黑線黑箭頭標(biāo)識(shí)出來(lái)的部分
二、ORM框架
- O是object凛辣,也就類對(duì)象的意思抱既。
- R是relation,翻譯成中文是關(guān)系扁誓,也就是關(guān)系數(shù)據(jù)庫(kù)中數(shù)據(jù)表的意思防泵。
- M是mapping蚀之,是映射的意思。
在ORM框架中捷泞,它幫我們把類和數(shù)據(jù)表進(jìn)行了一個(gè)映射足删,可以讓我們通過(guò)類和類對(duì)象就能操作它所對(duì)應(yīng)的表格中的數(shù)據(jù)。ORM框架還有一個(gè)功能锁右,它可以根據(jù)我們?cè)O(shè)計(jì)的類自動(dòng)幫我們生成數(shù)據(jù)庫(kù)中的表格失受,省去了我們自己建表的過(guò)程。
django中內(nèi)嵌了ORM框架咏瑟,不需要直接面向數(shù)據(jù)庫(kù)編程拂到,而是定義模型類,通過(guò)模型類和對(duì)象完成數(shù)據(jù)表的增刪改查操作码泞。
使用django進(jìn)行數(shù)據(jù)庫(kù)開發(fā)的步驟如下:
- 在models.py中定義模型類
- 遷移
- 通過(guò)類和對(duì)象完成數(shù)據(jù)增刪改查操作
下面我們以保存圖書信息為例來(lái)給大家介紹Django中進(jìn)行數(shù)據(jù)庫(kù)開發(fā)的整個(gè)流程兄旬。
1.定義模型類
模型類定義在models.py文件中,繼承自models.Model類浦夷。
注:不需要定義主鍵列辖试,在生成時(shí)會(huì)自動(dòng)添加,并且值為自動(dòng)增長(zhǎng)劈狐。
設(shè)計(jì)圖書類
- 類名:BookInfo
- 圖書名稱:btitle
- 圖書發(fā)布日期:bpub_date
根據(jù)設(shè)計(jì)罐孝,在models.py中定義模型類如下:
from django.db import models
class BookInfo(models.Model):
# 圖書名 --- > 字符串類型, 最大長(zhǎng)度為20
btitle = models.CharField(max_length=20)
# 出版日期 ---> 日期類型
bpub_date = models.DateField()
2.遷移
- 生成遷移文件:根據(jù)模型類生成創(chuàng)建表的遷移文件肥缔。
- 執(zhí)行遷移:根據(jù)第一步生成的遷移文件在數(shù)據(jù)庫(kù)中創(chuàng)建表莲兢。
首先打開cmd 輸入workon py_django 然后cd 到 pytest\test1文件夾(在pycharm內(nèi)直接用內(nèi)置的terminal即可)
生成遷移文件命令如下:
python manage.py makemigrations
執(zhí)行生成遷移文件命令后,會(huì)在應(yīng)用booktest目錄下的migrations目錄中生成遷移文件续膳。
生成遷移文件后的目錄結(jié)構(gòu):
執(zhí)行遷移命令如下:
python manage.py migrate
當(dāng)執(zhí)行遷移命令后改艇,Django框架會(huì)讀取遷移文件自動(dòng)幫我們?cè)跀?shù)據(jù)庫(kù)中生成對(duì)應(yīng)的表格。
Django默認(rèn)采用sqlite3數(shù)據(jù)庫(kù)坟岔,上圖中的db.sqlite3就是Django框架幫我們自動(dòng)生成的數(shù)據(jù)庫(kù)文件谒兄。 sqlite3是一個(gè)很小的數(shù)據(jù)庫(kù),通常用在手機(jī)中社付,它跟mysql一樣承疲,我們也可以通過(guò)sql語(yǔ)句來(lái)操作它。
下面使用pycharm自帶的datasource打開db.sqlite3文件進(jìn)行查看
點(diǎn)擊右側(cè)datasource然后新建SQLite數(shù)據(jù)庫(kù)
找到本項(xiàng)目的數(shù)據(jù)庫(kù)文件
點(diǎn)擊打開之后鸥咖,點(diǎn)開Tables找到booktest_bookinfo燕鸽,可以發(fā)現(xiàn)這個(gè)表中有三個(gè)列,列名跟BookInfo中類屬性的名字是一樣的
雙擊上圖中的booktest_bookinfo表啼辣,可以在窗口中查看表格中的數(shù)據(jù)啊研,這里表中還沒(méi)有數(shù)據(jù)。
默認(rèn)生成的表名稱
細(xì)心的同學(xué)會(huì)發(fā)現(xiàn)我們上面生成的表的名字叫做booktest_bookinfo,booktest是應(yīng)用的名字党远,bookinfo是模型類的名字削解。
數(shù)據(jù)表的默認(rèn)名稱為
<app_name>_<model_name>
例:
booktest_bookinfo
3.使用shell操作數(shù)據(jù)庫(kù)
完成數(shù)據(jù)表的遷移之后,下面就可以通過(guò)進(jìn)入項(xiàng)目的shell沟娱,進(jìn)行簡(jiǎn)單的API操作钠绍。如果需要退出項(xiàng)目,可以使用ctrl+d快捷鍵或輸入quit()花沉。
進(jìn)入項(xiàng)目shell的命令:
在終端執(zhí)行以下命令:
python manage.py shell
>>> from booktest.models import BookInfo
>>> b = BookInfo()
>>> b.btitle = '神雕'
>>> from datetime import date
>>> b.bpub_date = date(2000,1,4)
>>> b.save()
這樣我們就在數(shù)據(jù)庫(kù)成功的添加了一條數(shù)據(jù)
對(duì)著兩個(gè)類進(jìn)行數(shù)據(jù)操作
設(shè)計(jì)英雄類
- 類名:HeroInfo
- 英雄姓名:hname
- 英雄性別:hgender
- 英雄簡(jiǎn)介:hcomment
- 英雄所屬圖書:hbook
- 圖書-英雄的關(guān)系為一對(duì)多
打開booktest/models.py,定義英雄類代碼如下:
class HeroInfo(models.Model):
# 英雄姓名
hname = models.CharField(max_length=20)
# 英雄性別 默認(rèn)False是男性
hgender = models.BooleanField()
# 英雄簡(jiǎn)介
hcomment = models.CharField(max_length=100)
# 英雄所屬圖書
hbook = models.ForeignKey('BookInfo')
# 圖書 - 英雄的關(guān)系為一對(duì)多
這里要說(shuō)明的是媳握,BookInfo類和HeroInfo類之間具有一對(duì)多的關(guān)系碱屁,這個(gè)一對(duì)多的關(guān)系應(yīng)該定義在多的那個(gè)類,也就是HeroInfo類中蛾找。
hbook = models.ForeignKey('BookInfo')這句代碼就讓BookInfo類和HeroInfo類之間建立了一對(duì)多的關(guān)系娩脾。
在我們之后遷移生成表的時(shí)候,Django框架就會(huì)自動(dòng)幫我們?cè)趫D書表和英雄表之間建立一個(gè)外鍵關(guān)系打毛。
生成遷移文件:
python manage.py makemigrations
項(xiàng)目目錄結(jié)構(gòu):
之前的001不要?jiǎng)h除柿赊,因?yàn)?02依賴001
執(zhí)行遷移的命令:
python manage.py migrate
注意上圖中booktest_heroinfo表中有一列hbook_id,這一列名為什么不叫hbook幻枉? hbook_id是根據(jù)HeroInfo類的關(guān)系屬性hbook生成的碰声,對(duì)應(yīng)著圖書表中的主鍵id。
python manage.py shell
首先引入booktest/models中的類:
from booktest.models import BookInfo,HeroInfo
查詢所有圖書信息:
BookInfo.objects.all()
查找圖書信息并查看值:
b=BookInfo.objects.get(id=1)
b
b.id
b.btitle
b.bpub_date
刪除圖書信息:
b.delete()
對(duì)象的關(guān)聯(lián)操作
對(duì)于HeroInfo可以按照上面的方式進(jìn)行增刪改查操作熬甫。
在shell中創(chuàng)建一個(gè)BookInfo對(duì)象
b=BookInfo()
b.btitle='天龍八部'
b.bpub_date=date(1992,1,1)
b.save()
創(chuàng)建一個(gè)HeroInfo對(duì)象
h=HeroInfo()
h.hname='掃地僧'
h.hgender=False
h.hcomment='高手都很低調(diào)'
# hbook賦值是一對(duì)多
h.hbook=b
圖書與英雄是一對(duì)多的關(guān)系胰挑,django中提供了關(guān)聯(lián)的操作方式。
獲得關(guān)聯(lián)集合:返回當(dāng)前book對(duì)象的所有hero椿肩。
查詢出b圖書中所有英雄人物的信息
b.heroinfo_set.all()
后臺(tái)管理
Django能夠根據(jù)定義的模型類自動(dòng)地生成管理頁(yè)面瞻颂。
使用Django的管理模塊,需要按照如下步驟操作:
- 管理界面本地化
- 創(chuàng)建管理員
- 注冊(cè)模型類
- 自定義管理頁(yè)面
管理界面本地化
本地化是將顯示的語(yǔ)言郑象、時(shí)間等使用本地的習(xí)慣贡这,這里的本地化就是進(jìn)行中國(guó)化,中國(guó)大陸地區(qū)使用簡(jiǎn)體中文厂榛,時(shí)區(qū)使用亞洲/上海時(shí)區(qū)盖矫,注意這里不使用北京時(shí)區(qū)表示。
打開test1/settings.py文件噪沙,找到語(yǔ)言編碼炼彪、時(shí)區(qū)的設(shè)置項(xiàng),將內(nèi)容改為如下
LANGUAGE_CODE = 'zh-hans' #使用中國(guó)語(yǔ)言
TIME_ZONE = 'Asia/Shanghai' #使用中國(guó)上海時(shí)間
創(chuàng)建管理員
創(chuàng)建管理員的命令如下正歼,按提示輸入用戶名辐马、郵箱、密碼。
python manage.py createsuperuser
接下來(lái)啟動(dòng)服務(wù)器喜爷。(8888端口)
python manage.py runserver 127.0.0.1:8888
打開瀏覽器冗疮,在地址欄中輸入如下地址后回車。
http://127.0.0.1:8888/admin/
注冊(cè)模型類
登錄后臺(tái)管理后檩帐,默認(rèn)沒(méi)有我們創(chuàng)建的應(yīng)用中定義的模型類术幔,需要在自己應(yīng)用中的admin.py文件中注冊(cè),才可以在后臺(tái)管理中看到湃密,并進(jìn)行增刪改查操作诅挑。
打開booktest/admin.py文件,編寫如下代碼
from django.contrib import admin
from booktest.models import BookInfo,HeroInfo
admin.site.register(BookInfo)
admin.site.register(HeroInfo)
到瀏覽器中刷新頁(yè)面泛源,可以看到模型類BookInfo和HeroInfo的管理了拔妥。
點(diǎn)擊類名稱"BookInfo"可以進(jìn)入列表頁(yè),默認(rèn)只有一列达箍。
默認(rèn)顯示的是英雄的對(duì)象名没龙,如果想顯示英雄名需要修改model的str方法
在models.py中在對(duì)應(yīng)的類中分別些str方法
def __str__(self):
return self.btitle
def __str__(self):
return self.hname
這樣就顯示英雄名了
頁(yè)面里有增刪改查功能
自定義管理頁(yè)面
在列表頁(yè)只顯示出了BookInfo object,對(duì)象的其它屬性并沒(méi)有列出來(lái)缎玫,查看非常不方便硬纤。 Django提供了自定義管理頁(yè)面的功能,比如列表頁(yè)要顯示哪些值赃磨。
打開booktest/admin.py文件筝家,自定義類,繼承自admin.ModelAdmin類煞躬。
- 屬性list_display表示要顯示哪些屬性
class BookInfoAdmin(admin.ModelAdmin):
list_display = ['id', 'btitle', 'bpub_date']
class HeroInfoAdmin(admin.ModelAdmin):
list_display = ['id', 'hname','hgender','hcomment']
- 修改模型類BookInfo,HeroInfo的注冊(cè)代碼如下
admin.site.register(BookInfo, BookInfoAdmin)
admin.site.register(HeroInfo,HeroInfoAdmin)
視圖
對(duì)于django的設(shè)計(jì)框架MVT肛鹏,用戶在URL中請(qǐng)求的是視圖,視圖接收請(qǐng)求后進(jìn)行處理恩沛,并將處理的結(jié)果返回給請(qǐng)求者在扰。
使用視圖時(shí)需要進(jìn)行兩步操作
- 定義視圖函數(shù)
- 配置URLconf
1.定義視圖
視圖就是一個(gè)Python函數(shù),被定義在views.py中雷客。
視圖的必須有一個(gè)參數(shù)芒珠,一般叫request,視圖必須返回HttpResponse對(duì)象搅裙,HttpResponse中的參數(shù)內(nèi)容會(huì)顯示在瀏覽器的頁(yè)面上皱卓。
打開booktest/views.py文件,定義視圖index如下:
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello Django!")
2.配置URLconf
一條URLconf包括url規(guī)則部逮、視圖兩部分:
url規(guī)則使用正則表達(dá)式定義娜汁。
視圖就是在views.py中定義的視圖函數(shù)。
需要兩步完成URLconf配置:
- 在應(yīng)用中定義URLconf
- 包含到項(xiàng)目的URLconf中
在booktest/應(yīng)用下創(chuàng)建urls.py文件兄朋,定義代碼如下:
from django.conf.urls import url
from booktest import views
# $嚴(yán)格的字符匹配
urlpatterns = [
# views.index建立與index和視圖index的關(guān)系
url(r'^index', views.index),
]
包含到項(xiàng)目中:打開test1/urls.py文件掐禁,為urlpatterns列表增加項(xiàng)如下:
# 第一個(gè)參數(shù)正則匹配表達(dá)式,包含booktest中的url應(yīng)用文件
url(r'^', include('booktest.urls')),
視圖和URLconf都定義好了,接下來(lái)在瀏覽器地址欄中輸入網(wǎng)址:
http://127.0.0.1:8888/index
網(wǎng)頁(yè)顯示效果如下圖傅事,視圖被成功執(zhí)行了缕允。
接下來(lái)我們?cè)俳⒁粋€(gè)index2
在views.p中添加如下代碼
from django.template import loader, RequestContext
# Create your views here.
#定義url地址的
from django.http import HttpResponse
#http://127.0.0.1:8888/index
def index(request):
return HttpResponse("hello,django!")
def index2(request):
return HttpResponse("index2!")
在bootest中添加
url(r'^index2$', views.index2),
接下來(lái)在瀏覽器地址欄中輸入網(wǎng)址:
http://127.0.0.1:8888/index2
模板
創(chuàng)建模板
為應(yīng)用booktest下的視圖index創(chuàng)建模板index.html,目錄結(jié)構(gòu)如下圖:
設(shè)置查找模板的路徑:打開test1/settings.py文件蹭越,設(shè)置TEMPLATES的DIRS值
'DIRS': [os.path.join(BASE_DIR, 'templates')],
定義模板
打開templtes/booktest/index.html文件障本,定義代碼如下:
<html>
<head>
<title>圖書列表</title>
</head>
<body>
<h1>{{title}}</h1>
{%for i in list%}
{{i}}<br>
{%endfor%}
</body>
</html>
在模板中輸出變量語(yǔ)法如下,變量可能是從視圖中傳遞過(guò)來(lái)的响鹃,也可能是在模板中定義的驾霜。
{{變量名}}
在模板中編寫代碼段語(yǔ)法如下:
{%代碼段%}
視圖調(diào)用模板
調(diào)用模板分為三步驟:
- 找到模板
- 定義上下文
- 渲染模板
打開booktst/views.py文件,調(diào)用上面定義的模板文件
from django.template import loader, RequestContext
# Create your views here.
#定義url地址的
from django.http import HttpResponse
#http://127.0.0.1:8888/index
def index(request):
return HttpResponse("hello,django!")
def index2(request):
return HttpResponse("index2!")
def index3(request):
template = loader.get_template('booktest/index.html')
# 2.定義上下文
context = RequestContext(request, {'title': '圖書列表', 'list': range(10)})
# 3.渲染模板
return HttpResponse(template.render(context))
在booktest/應(yīng)用下創(chuàng)建urls.py文件买置,定義代碼如下
from django.conf.urls import url
from booktest import views
#http://127.0.0.1:8888/index
#http://127.0.0.1:8888/index2
# $嚴(yán)格匹配
urlpatterns = [
url(r'^index$', views.index),
url(r'^index2$', views.index2),
url(r'^index3$', views.index3),
]