現(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)用:
這將會創(chuàng)建一個 polls 目錄敛纲,它的目錄結(jié)構(gòu)大致如下:$ python manage.py startapp polls
編寫第一個視圖
打開 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ù):route
和 view
棍郎,兩個可選參數(shù):kwargs
和 name
其障。
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
考婴、 PASSWORD
、 HOST
等等催烘。
編輯 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_text
或 pub_date
)也是字段名展箱,所以最好使用對機(jī)器友好的格式。你將會在 Python 代碼里使用它們蹬昌,而數(shù)據(jù)庫會將它們作為列名混驰。
定義某些 Field
類實(shí)例需要參數(shù)。例如 CharField
需要一個 max_length
參數(shù)皂贩。這個參數(shù)的用處不止于用來定義數(shù)據(jù)庫結(jié)構(gòu)栖榨,也用于驗(yàn)證數(shù)據(jù)。
Field
也能夠接收多個可選參數(shù)先紫;在上面的例子中:我們將 votes
的 default
也就是默認(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)建可以與Question
和 Choice
對象進(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.py
中 INSTALLED_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
再次運(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)該被顯示在索引頁里仓洼,刷新下管理員頁面:現(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)用就行: