(2) Django-創(chuàng)建第一個app應(yīng)用

現(xiàn)在你的開發(fā)環(huán)境——這個“項(xiàng)目” ——已經(jīng)配置好了趟径,你可以開始干活了墨辛。

項(xiàng)目和應(yīng)用有啥區(qū)別卓研?應(yīng)用是一個專門做某件事的網(wǎng)絡(luò)應(yīng)用程序——比如博客系統(tǒng),或者公共記錄的數(shù)據(jù)庫背蟆,或者簡單的投票程序鉴分。項(xiàng)目則是一個網(wǎng)站使用的配置和應(yīng)用的集合。項(xiàng)目可以包含很多個應(yīng)用带膀。應(yīng)用可以被很多個項(xiàng)目使用志珍。

應(yīng)用可以存放在任何 Python path中定義的路徑。這里將在 manage.py 同級目錄下創(chuàng)建一個投票應(yīng)用垛叨。這樣它就可以作為頂級模塊導(dǎo)入伦糯,而不是 mysite 的子模塊柜某。

在處于 manage.py 所在的目錄下,然后運(yùn)行這行命令來創(chuàng)建一個應(yīng)用:

$ python manage.py startapp polls

這將會創(chuàng)建一個 polls 目錄敛纲,它的目錄結(jié)構(gòu)大致如下:
投票應(yīng)用目錄結(jié)構(gòu)

編寫第一個視圖

打開 polls/views.py喂击,把下面這些 Python 代碼輸入進(jìn)去:

from django.http import HttpResponse

def index(request):
    return HttpResponse('你好,這里是投票應(yīng)用的首頁')

這是 Django 中最簡單的視圖淤翔。如果想看見效果翰绊,我們需要將一個 URL 映射到它——這就是我們需要 URLconf 的原因了。
為了創(chuàng)建 URLconf旁壮,請?jiān)?polls目錄里新建一個urls.py 文件监嗜。

polls/urls.py 中,輸入如下代碼:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    ]

下一步是要在根 URLconf 文件中指定我們創(chuàng)建的 polls.urls模塊抡谐。在mysite/urls.py文件的 urlpatterns列表里插入一個 include()裁奇, 如下:

from django.contrib import admin
from django.urls import path, include  #導(dǎo)入include模塊

urlpatterns = [
    path('admin/', admin.site.urls),
    path('polls/', include('polls.urls')),  #包含投票模塊
]

函數(shù) include() 允許引用其它 URLconfs。
因?yàn)橥镀睉?yīng)用有它自己的 URLconf( polls/urls.py)麦撵,他們能夠被放在"/polls/"刽肠,"/fun_polls/""/content/polls/"免胃,或者其他任何路徑下音五,這個應(yīng)用都能夠正常工作。

現(xiàn)在把 index 視圖添加進(jìn)了 URLconf杜秸》耪蹋可以驗(yàn)證是否正常工作润绎,運(yùn)行下面的命令:

$ python manage.py runserver

用瀏覽器訪問 http://localhost:8000/polls/撬碟,你應(yīng)該能夠看見 "你好,這里是投票應(yīng)用的首頁" 莉撇,這是在 index 視圖中定義的呢蛤。

函數(shù) path() 具有四個參數(shù),兩個必須參數(shù):routeview棍郎,兩個可選參數(shù):kwargsname其障。

path() 參數(shù): route

route 是一個匹配 URL 的準(zhǔn)則(類似正則表達(dá)式)。當(dāng) Django 響應(yīng)一個請求時涂佃,它會從 urlpatterns 的第一項(xiàng)開始励翼,按順序依次匹配列表中的項(xiàng),直到找到匹配的項(xiàng)辜荠。

這些準(zhǔn)則不會匹配 GET 和 POST 參數(shù)或域名汽抚。例如,URLconf 在處理請求https://www.example.com/myapp/ 時伯病,它會嘗試匹配 myapp/ 造烁。處理請求https://www.example.com/myapp/?page=3 時,也只會嘗試匹配 myapp/。

path() 參數(shù): view

當(dāng) Django 找到了一個匹配的準(zhǔn)則惭蟋,就會調(diào)用這個特定的視圖函數(shù)苗桂,并傳入一個 HttpRequest對象作為第一個參數(shù),被“捕獲”的參數(shù)以關(guān)鍵字參數(shù)的形式傳入告组。

path() 參數(shù): kwargs

任意個關(guān)鍵字參數(shù)可以作為一個字典傳遞給目標(biāo)視圖函數(shù)煤伟。

path() 參數(shù): name

為你的 URL 取名能使你在 Django 的任意地方唯一地引用它,尤其是在模板中木缝。這個有用的特性允許你只改一個文件就能全局地修改某個 URL 模式持偏。


數(shù)據(jù)庫配置

打開 mysite/settings.py 。這是個包含了 Django 項(xiàng)目設(shè)置的 Python 模塊氨肌。

通常鸿秆,這個配置文件使用 SQLite 作為默認(rèn)數(shù)據(jù)庫。Python 內(nèi)置 SQLite怎囚,所以你無需安裝額外東西來使用它卿叽。

如果你不使用 SQLite,則必須添加一些額外設(shè)置恳守,比如 USER考婴、 PASSWORDHOST 等等催烘。

編輯 mysite/settings.py 文件前沥阱,先設(shè)置 `TIME_ZONE為你自己時區(qū)。這里將時區(qū)改為上海時區(qū)

TIME_ZONE = 'Asia/Shanghai'

此外伊群,關(guān)注一下文件頭部的 INSTALLED_APPS 設(shè)置項(xiàng)考杉。這里包括了會在你項(xiàng)目中啟用的所有 Django 應(yīng)用。應(yīng)用能在多個項(xiàng)目中使用舰始,你也可以打包并且發(fā)布應(yīng)用崇棠,讓別人使用它們。
通常丸卷, INSTALLED_APPS默認(rèn)包括了以下 Django 的自帶應(yīng)用:

  • django.contrib.admin -- 管理員站點(diǎn)枕稀。
  • django.contrib.auth -- 認(rèn)證授權(quán)系統(tǒng)。
  • django.contrib.contenttypes -- 內(nèi)容類型框架谜嫉。
  • django.contrib.sessions -- 會話框架萎坷。
  • django.contrib.messages-- 消息框架。
  • django.contrib.staticfiles -- 管理靜態(tài)文件的框架沐兰。

默認(rèn)開啟的某些應(yīng)用需要至少一個數(shù)據(jù)表哆档,所以,在使用他們之前需要在數(shù)據(jù)庫中創(chuàng)建一些表僧鲁。在命令行下執(zhí)行以下命令:

$ python manage.py migrate

這個 migrate命令檢查 INSTALLED_APPS設(shè)置虐呻,為其中的每個應(yīng)用創(chuàng)建需要的數(shù)據(jù)表象泵,至于具體會創(chuàng)建什么,這取決于 mysite/settings.py 設(shè)置文件和每個應(yīng)用的數(shù)據(jù)庫遷移文件斟叼。


創(chuàng)建模型

在 Django 里寫一個數(shù)據(jù)庫驅(qū)動的 Web 應(yīng)用的第一步是定義模型 - 也就是數(shù)據(jù)庫結(jié)構(gòu)設(shè)計(jì)和附加的其它元數(shù)據(jù)偶惠。

在這個簡單的投票應(yīng)用中,需要創(chuàng)建兩個模型:問題 Question 和選項(xiàng) Choice朗涩。Question 模型包括問題描述和發(fā)布時間忽孽。Choice模型有兩個字段,選項(xiàng)描述和當(dāng)前得票數(shù)谢床。每個選項(xiàng)屬于一個問題兄一。

按照下面的例子來編輯 polls/models.py文件:

from django.db import models


class Question(models.Model):   #繼承models.Model類
    question_text = models.CharField('問題',max_length=200)   #定義問題描述字段及最大長度
    pub_date = models.DateTimeField('發(fā)布日期')     #定義發(fā)布日期字段


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)  #定義選項(xiàng)描述字段
    votes = models.IntegerField(default=0)  #定義得票數(shù)字段

代碼非常直白。每個模型被表示為 django.db.models.Model 類的子類识腿。每個模型有一些類變量出革,它們都表示模型里的一個數(shù)據(jù)庫字段。

每個字段都是 Field類的實(shí)例 - 比如渡讼,字符字段被表示為 CharField 骂束,日期時間字段被表示為 DateTimeField。這將告訴 Django 每個字段要處理的數(shù)據(jù)類型成箫。

每個 Field類實(shí)例變量的名字(例如 question_textpub_date )也是字段名展箱,所以最好使用對機(jī)器友好的格式。你將會在 Python 代碼里使用它們蹬昌,而數(shù)據(jù)庫會將它們作為列名混驰。

定義某些 Field類實(shí)例需要參數(shù)。例如 CharField需要一個 max_length 參數(shù)皂贩。這個參數(shù)的用處不止于用來定義數(shù)據(jù)庫結(jié)構(gòu)栖榨,也用于驗(yàn)證數(shù)據(jù)。

Field也能夠接收多個可選參數(shù)先紫;在上面的例子中:我們將 votesdefault也就是默認(rèn)值治泥,設(shè)為0。

注意在最后遮精,我們使用 ForeignKey定義了一個關(guān)系。這將告訴 Django败潦,每個 Choice 對象都關(guān)聯(lián)到一個Question 對象本冲。Django 支持所有常用的數(shù)據(jù)庫關(guān)系:多對一、多對多和一對一劫扒。

激活模型

上面的一小段用于創(chuàng)建模型的代碼給了 Django 很多信息檬洞,通過這些信息,Django 可以:

為這個應(yīng)用創(chuàng)建數(shù)據(jù)庫 schema(生成 CREATE TABLE語句)沟饥。
創(chuàng)建可以與QuestionChoice對象進(jìn)行交互的 Python 數(shù)據(jù)庫 API添怔。
但是首先得把 polls應(yīng)用安裝到我們的項(xiàng)目里湾戳。

為了在我們的工程中包含這個應(yīng)用,我們需要在配置類 INSTALLED_APPS 中添加設(shè)置广料。因?yàn)?PollsConfig 類寫在文件 polls/apps.py 中砾脑,所以它的點(diǎn)式路徑是 'polls.apps.PollsConfig'。在文件 mysite/settings.pyINSTALLED_APPS子項(xiàng)添加點(diǎn)式路徑后艾杏,它看起來像這樣:

INSTALLED_APPS = [
    'polls.apps.PollsConfig',  #自定義的投票app
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

現(xiàn)在 Django 項(xiàng)目會包含 polls 應(yīng)用韧衣。接著運(yùn)行下面的命令:

$ python manage.py makemigrations polls

image.png

再次運(yùn)行 migrate 命令,在數(shù)據(jù)庫里創(chuàng)建新定義的模型的數(shù)據(jù)表:

$ python manage.py migrate

這個 migrate 命令選中所有還沒有執(zhí)行過的遷移(Django 通過在數(shù)據(jù)庫中創(chuàng)建一個特殊的表 django_migrations 來跟蹤執(zhí)行過哪些遷移)并應(yīng)用在數(shù)據(jù)庫上 - 也就是將你對模型的更改同步到數(shù)據(jù)庫結(jié)構(gòu)上购桑。

遷移是非常強(qiáng)大的功能畅铭,它能讓你在開發(fā)過程中持續(xù)的改變數(shù)據(jù)庫結(jié)構(gòu)而不需要重新刪除和創(chuàng)建表 - 它專注于使數(shù)據(jù)庫平滑升級而不會丟失數(shù)據(jù)。我們會在后面的教程中更加深入的學(xué)習(xí)這部分內(nèi)容勃蜘,現(xiàn)在硕噩,你只需要記住,改變模型需要這三步:

  • 編輯 models.py 文件缭贡,改變模型榴徐。
  • 運(yùn)行 python manage.py makemigrations為模型的改變生成遷移文件。
  • 運(yùn)行 python manage.py migrate來應(yīng)用數(shù)據(jù)庫遷移匀归。

數(shù)據(jù)庫遷移被分解成生成和應(yīng)用兩個命令是為了讓你能夠在代碼控制系統(tǒng)上提交遷移數(shù)據(jù)并使其能在多個應(yīng)用里使用坑资;這不僅僅會讓開發(fā)更加簡單,也給別的開發(fā)者和生產(chǎn)環(huán)境中的使用帶來方便穆端。

Django 管理頁面

創(chuàng)建一個管理員賬號

首先袱贮,我們得創(chuàng)建一個能登錄頁面的用戶。請運(yùn)行下面的命令:

$ python manage.py createsuperuser

依次輸入用戶名体啰、郵件地址攒巍、密碼(兩次)后輸入 y 確認(rèn)即可。

啟動開發(fā)服務(wù)器

$ python manage.py runserver

打開瀏覽器荒勇,轉(zhuǎn)到你本地域名的 "/admin/" 目錄柒莉, -- 比如 "http://127.0.0.1:8000/admin/" 。你應(yīng)該會看見管理員登錄界面:

管理員登陸

進(jìn)入管理站點(diǎn)頁面

現(xiàn)在沽翔,試著使用你在上一步中創(chuàng)建的超級用戶來登錄兢孝。然后你將會看到 Django 管理頁面的索引頁:

管理頁面

你將會看到幾種可編輯的內(nèi)容:組和用戶。它們是由 django.contrib.auth提供的仅偎,這是 Django 開發(fā)的認(rèn)證框架跨蟹。

向管理頁面中加入投票應(yīng)用

但是我們的投票應(yīng)用在哪呢?它沒在索引頁面里顯示橘沥。

只需要做一件事:我們得告訴管理頁面窗轩,問題 Question 對象需要被管理。打開 polls/admin.py 文件座咆,把它編輯成下面這樣:

from django.contrib import admin
from .models import Question

admin.site.register(Question)

便捷的管理功能

現(xiàn)在我們向管理頁面注冊了問題 Question 類痢艺。Django 知道它應(yīng)該被顯示在索引頁里仓洼,刷新下管理員頁面:
image.png

現(xiàn)在就能看到問題 "Questions" 對象了,可以很方便的進(jìn)行增刪改查操作堤舒。

編寫更多視圖

Django 中的視圖的概念是「一類具有相同功能和模板的網(wǎng)頁的集合」色建。

在我們的投票應(yīng)用中,我們需要下列幾個視圖:

  • 問題索引頁——展示最近的幾個投票問題植酥。
  • 問題詳情頁——展示某個投票的問題和不帶結(jié)果的選項(xiàng)列表镀岛。
  • 問題結(jié)果頁——展示某個投票的結(jié)果。
  • 投票處理器——用于響應(yīng)用戶為某個問題的特定選項(xiàng)投票的操作友驮。

在 Django 中漂羊,網(wǎng)頁和其他內(nèi)容都是從視圖派生而來。每一個視圖表現(xiàn)為一個簡單的 Python 函數(shù)(或者說方法卸留,如果是在基于類的視圖里的話)走越。Django 將會根據(jù)用戶請求的 URL 來選擇使用哪個視圖(更準(zhǔn)確的說,是根據(jù) URL 中域名之后的部分)耻瑟。

現(xiàn)在讓我們向 polls/views.py 里添加更多視圖旨指。這些視圖有一些不同,因?yàn)樗麄兘邮諈?shù):

from django.http import HttpResponse

def index(request): #問題索引頁
    return HttpResponse('你好喳整,這里是投票應(yīng)用的首頁')

def detail(request, question_id):#問題詳情頁
    return HttpResponse('這是問題 {}'.format(question_id))

def results(request, question_id):#問題結(jié)果頁
    response = '這是問題 {} 的結(jié)果'.format(question_id)
    return HttpResponse(response % question_id)

def vote(request, question_id): #投票處理器
    return HttpResponse('投票給問題 {}'.format(question_id))

把這些新視圖添加進(jìn) polls.urls 模塊里谆构,只要添加幾個 url()函數(shù)調(diào)用就行:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市框都,隨后出現(xiàn)的幾起案子搬素,更是在濱河造成了極大的恐慌,老刑警劉巖魏保,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熬尺,死亡現(xiàn)場離奇詭異,居然都是意外死亡谓罗,警方通過查閱死者的電腦和手機(jī)粱哼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來檩咱,“玉大人揭措,你說我怎么就攤上這事∷笆郑” “怎么了蜂筹?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長芦倒。 經(jīng)常有香客問我,道長不翩,這世上最難降的妖魔是什么兵扬? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任麻裳,我火速辦了婚禮,結(jié)果婚禮上器钟,老公的妹妹穿的比我還像新娘津坑。我一直安慰自己,他們只是感情好傲霸,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布疆瑰。 她就那樣靜靜地躺著,像睡著了一般昙啄。 火紅的嫁衣襯著肌膚如雪穆役。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天梳凛,我揣著相機(jī)與錄音耿币,去河邊找鬼。 笑死韧拒,一個胖子當(dāng)著我的面吹牛淹接,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叛溢,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼塑悼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了楷掉?” 一聲冷哼從身側(cè)響起厢蒜,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎靖诗,沒想到半個月后郭怪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刊橘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年鄙才,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片促绵。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡攒庵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出败晴,到底是詐尸還是另有隱情浓冒,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布尖坤,位于F島的核電站稳懒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏慢味。R本人自食惡果不足惜场梆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一墅冷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧或油,春花似錦寞忿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辖佣,卻和暖如春霹抛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凌简。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工上炎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雏搂。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓藕施,卻偏偏與公主長得像,于是被迫代替她去往敵國和親凸郑。 傳聞我的和親對象是個殘疾皇子裳食,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

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