Django第2天

一荒叼、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ā)的步驟如下:

  1. 在models.py中定義模型類
  2. 遷移
  3. 通過(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.遷移

  1. 生成遷移文件:根據(jù)模型類生成創(chuàng)建表的遷移文件肥缔。
  2. 執(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)行兩步操作

  1. 定義視圖函數(shù)
  2. 配置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配置:

  1. 在應(yīng)用中定義URLconf
  2. 包含到項(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)用模板分為三步驟:

  1. 找到模板
  2. 定義上下文
  3. 渲染模板

打開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),
]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末寄悯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子堕义,更是在濱河造成了極大的恐慌,老刑警劉巖脆栋,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倦卖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡椿争,警方通過(guò)查閱死者的電腦和手機(jī)怕膛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)秦踪,“玉大人褐捻,你說(shuō)我怎么就攤上這事∫蔚耍” “怎么了柠逞?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)景馁。 經(jīng)常有香客問(wèn)我板壮,道長(zhǎng),這世上最難降的妖魔是什么合住? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任绰精,我火速辦了婚禮,結(jié)果婚禮上透葛,老公的妹妹穿的比我還像新娘笨使。我一直安慰自己,他們只是感情好僚害,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布硫椰。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪最爬。 梳的紋絲不亂的頭發(fā)上涉馁,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音爱致,去河邊找鬼烤送。 笑死,一個(gè)胖子當(dāng)著我的面吹牛糠悯,可吹牛的內(nèi)容都是我干的帮坚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼互艾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼试和!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起纫普,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤阅悍,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后昨稼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體节视,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年假栓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寻行。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡匾荆,死狀恐怖拌蜘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情牙丽,我是刑警寧澤简卧,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站烤芦,受9級(jí)特大地震影響贞滨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拍棕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一晓铆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绰播,春花似錦骄噪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)事甜。三九已至,卻和暖如春滔韵,著一層夾襖步出監(jiān)牢的瞬間逻谦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工陪蜻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留邦马,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓宴卖,卻偏偏與公主長(zhǎng)得像滋将,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子症昏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容