“全能”选手—Django 1.10文档中文版Part1
歡迎大家訪問我的個人網(wǎng)站《劉江的博客和教程》:www.liujiangblog.com
### 主要分享Python 及Django教程以及相關(guān)的博客
本文是博主翻譯的Django1.10版本官方文檔的第一部分,如時間充裕,爭取一直翻譯下去,經(jīng)驗不足,或有錯漏,敬請指正。
另外對于公開文檔進行翻譯的版權(quán)問題不是很清楚,如有侵權(quán)請聯(lián)系我!
另外,要轉(zhuǎn)載該系列翻譯文章,也請聯(lián)系博主。
第二部分傳送門
第三部分傳送門
第四部分傳送門
3.2 模型和數(shù)據(jù)庫Models and databases
3.2.2 查詢操作making queries
3.3.8 會話sessions
目錄
第一章、Django1.10文檔組成結(jié)構(gòu)
1.1 獲取幫助
1.2 文檔的組織形式
1.3 第一步
1.4 模型層
1.5 視圖層
1.6 模板層
1.7 表單
1.8 開發(fā)流程
1.9 admin站點
1.10 安全性
1.11 國際化和本地化
1.12 性能和優(yōu)化
1.13 Python兼容性
1.14 地理框架
1.15 常用WEB應用工具
1.16 其它核心功能
1.17 Django開源項目
第二章、起步
2.1 Django速覽
- 2.1.1 設計你的模型model
- 2.1.2 安裝model
- 2.1.3 使用API
- 2.1.4 功能強大的動態(tài)admin后臺管理界面
- 2.1.5 設計你的路由系統(tǒng)URLs
- 2.1.6 編寫你的視圖views
- 2.1.7 設計你的模板
- 2.1.8 總結(jié)
2.2 快速安裝指南
- 2.2.1 安裝Python
- 2.2.2 安裝Django
- 2.2.3 安裝驗證
2.3 第一個Django app,Part 1:請求和響應
- 2.3.1 創(chuàng)建project
- 2.3.2 開發(fā)服務器development server
- 2.3.3 創(chuàng)建投票程序(polls app)
- 2.3.4 編寫視圖
2.4 第一個Django app,Part 2:模型和admin站點
- 2.4.1 數(shù)據(jù)庫安裝
- 2.4.2 創(chuàng)建模型models
- 2.4.3 激活模型
- 2.4.4 學會使用API
- 2.4.5 Django admin站點介紹
第一章、Django1.10文檔組成結(jié)構(gòu)
1.1 獲取幫助
獲取幫助的方式:
- 參考第5.1節(jié)的FAQ,這里包含許多常見問題的回答
- 查找特定的信息?嘗試一下智能檢索、混合索引或者內(nèi)容詳細表
- 在10.2.1的DJango用戶郵件列表中查找信息或發(fā)布問題
- 在django的IRC頻道提問或者查找IRC日志看看是否已經(jīng)有類似問題
- 報告DJango中的bug
1.2 文檔的組織形式
Django有許多文檔,一個高層次的概覽有助于你快速找到想要的信息:
- 入門教程:手把手的教會你創(chuàng)建一個WEB應用。如果你是個Django或者WEB應用開發(fā)者新手,從這里開始學習是個不錯的選擇。也可以先看看下面的“第一步”。
- 主題向?qū)?#xff1a;討論一些比較關(guān)鍵的主題和概念,屬于比較高的水平,提供一些有用的背景信息和解釋。
- 參考指南:包含API的使用指導和一些Django內(nèi)核的其它方面。主要描述Django是怎么工作的,如何使用它。學習這部分的前提是你需要對一些關(guān)鍵概念具有基本的理解和掌握。
- “怎么辦”向?qū)?#xff1a;主要討論一些關(guān)鍵的問題和使用場景。比入門教程更深入,需要你對Django的工作機制有一定的了解。
1.3 第一步
如果你是Django或程序員新手,那么從這里開始吧!
- 從零開始:概覽 | 安裝
- 入門教程:Part 1:請求和響應 | Part 2:模型和admin站點 | Part 3:視圖和模板 | Part 4:表單和泛型 | Part 5:測試 | Part 6:靜態(tài)文件 | Part 7:自定制admin站點
- 高級教程: 如何編寫可重用的應用 | 編寫你的第一個Django補丁
1.4 模型層
Django提供了一個抽象的模型層,用于組織和操縱你的WEB應用數(shù)據(jù)。
- 模型:模型介紹 | 字段類型 | Meta選項 | 模型類
- 查詢結(jié)果集:執(zhí)行查詢 | 查詢結(jié)果集方法參考 | 查詢表達式
- 模型實例: 實例方法 | 訪問關(guān)系對象
- 遷移: 遷移介紹 | 操作參考 | 計劃編輯 | 編寫遷移
- 高級: 管理器 | 原生SQL | 事務 | 聚合 | 查找 | 自定義字段 | 多數(shù)據(jù)庫 | 自定義查詢 | 查詢表達式 | 條件表達式 | 數(shù)據(jù)庫函數(shù)
- 其它:支持的數(shù)據(jù)庫 | 遺留數(shù)據(jù)庫 | 提供初始化數(shù)據(jù) | 優(yōu)化數(shù)據(jù)庫訪問 | PostgreSQL特有
1.5 視圖層
Django將封裝響應用戶請求邏輯和返回數(shù)據(jù)稱為“視圖”。在下面的列表中,你能找到所有和視圖相關(guān)的內(nèi)容:
- 基礎: 路由配置 | 視圖函數(shù) | 快捷方式 | 裝飾器
- 參考: 內(nèi)置視圖 | 請求/響應對象 | 模板響應對象
- 文件上傳: 概覽 | 文件對象 | 儲存API | 管理文件 | 自定義存儲
- 基類視圖: 概覽 | 內(nèi)置顯示視圖 | 內(nèi)置編輯視圖 | 混合使用 | API參考 | 分類索引
- 高級: 生成CSV | 生成PDF
- 中間件:概覽 | 內(nèi)置中間件類
1.6 模板層
模板層提供一種人性化的語法,用于渲染展示給用戶的內(nèi)容,主要內(nèi)容包括下列:
- 基礎:概覽
- 對于設計師:語言概覽 | 內(nèi)置標簽和過濾器 | 人性化
- 對于程序員: 模板API | 自定義標簽和過濾器
1.7 表單
Django 提供了一個內(nèi)容豐富的框架可便利地創(chuàng)建表單及操作表單數(shù)據(jù)。
- 基礎: 概覽 | 表單 API | 內(nèi)置字段 | 內(nèi)置小工具
- 高級: 模型表單 | 表單外觀 | 表單集 | 自定義驗證
1.8 開發(fā)流程
學習不同的組件和工具,幫助你開發(fā)和測試Django應用。
- 設置:概覽 | 全部設置列表
- 應用: 概覽
- 異常:概覽
- Django-admin和manage.py:概覽 | 添加自定義命令
- 測試:介紹 | 編寫和運行測試 | 導入測試工具 | 高級主題
- 部署:概覽 | WSGI服務器 | 部署靜態(tài)文件 | 通過郵件跟蹤代碼錯誤
1.9 admin站點
在這里,你可以找到Django中最受歡迎的功能模塊——admin站點的一切:
- admin站點
- admin動作
- admin文檔生成器
1.10 安全性
開發(fā) Web 應用時安全是最重要一個的主題,Django 提供了多重保護工具和機制:
- 安全概覽
- 披露的Django安全問題
- 點擊劫持的防護
- 跨站請求偽造防護
- 加密簽名
- 安全中間件
1.11 國際化和本地化
Django 提供了一個強大的國際化和本地化框架,以協(xié)助您開發(fā)支持多國語言和世界各地區(qū)的應用:
- 概覽 | 國際化 |本地化 | 本地WEB UI 格式化和表單輸入
- 時區(qū)
1.12 性能和優(yōu)化
有許技術(shù)和工具可以幫助你的代碼運行得更加高效、快速,占用更少的系統(tǒng)資源。
- 性能和優(yōu)化概覽
1.13 Python兼容性
Django 希望兼容多個不同特性和版本的 Python:
- Jython支持
- Python3 兼容性
1.14 地理框架
GeoDjango 想要做一個世界級的地理Web框架。 它的目標是盡可能輕松的構(gòu)建GIS Web 應用和發(fā)揮空間數(shù)據(jù)的能力。
1.15 常用WEB應用工具
Django 為開發(fā)Web應用提供了多種常見的工具:
- 身份認證:概覽 | 使用認證系統(tǒng) | 密碼管理 | 自定義認證 | API參考
- 緩存
- 日志
- 發(fā)送郵件
- 聯(lián)合供稿(RSS/Atom)
- 分頁
- 消息框架
- 序列化
- 會話
- 站點地圖
- 靜態(tài)文件管理
- 數(shù)據(jù)驗證
1.16 其它核心功能
Django的其它核心功能包括:
- 按需處理內(nèi)容
- 內(nèi)容類型和泛型關(guān)系
- 簡單頁面
- 重定向
- 信號
- 系統(tǒng)檢查框架
- 站點框架
- 在 Django 中使用 Unicode
1.17 Django開源項目
下面是Django項目本身的開發(fā)進程和如何做出貢獻相關(guān):
- 社區(qū): 如何參與 | 發(fā)布過程 | 團隊組織 | 團隊會議 | 主要人員 | 源碼倉庫 | 安全策略 | 郵件列表
- 設計理念: 概述
- 文檔: 關(guān)于本文檔
- 第三方發(fā)行: 概述
- Django 的過去: API 穩(wěn)定性 | 發(fā)行說明和升級說明 | 功能棄用時間軸
第二章、起步
2.1 Django速覽
Django的開發(fā)背景是快節(jié)奏的新聞編輯室環(huán)境,因此它被設計成一個大而全的web框架,能夠快速簡單的完成任務。本節(jié)將快速介紹如何利用Django搭建一個數(shù)據(jù)庫驅(qū)動的WEB應用。
它不會有太多的技術(shù)細節(jié),只是讓你理解Django是如何工作的。
2.1.1 設計你的模型model
Django提供了ORM,通過它,你能直接使用Python代碼來描述你的數(shù)據(jù)庫設計。下面是一個例子:
# mysite/news/models.pyfrom django.db import modelsclass Reporter(models.Model):full_name = models.CharField(max_length=70)def __str__(self): # __unicode__ on Python 2return self.full_name class Article(models.Model):pub_date = models.DateField()headline = models.CharField(max_length=200)content = models.TextField()reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)def __str__(self): # __unicode__ on Python 2return self.headline2.1.2 安裝model
接下來,進入Django命令行工具,創(chuàng)建數(shù)據(jù)庫表:
$ python manage.py migrate
migrate命令查找所有可用的model,如果它還沒有在數(shù)據(jù)庫中存在,將根據(jù)model創(chuàng)建相應的表。注:也許你需要先執(zhí)行$ python manage.py makemigrations命令。
2.1.3 使用API
Django為你提供了大量的方便的數(shù)據(jù)庫操作API,無需你編寫額外的代碼。下面是個例子:
# Import the models we created from our "news" app >>> from news.models import Reporter, Article # No reporters are in the system yet. >>> Reporter.objects.all() <QuerySet []> # Create a new Reporter. >>> r = Reporter(full_name='John Smith') # Save the object into the database. You have to call save() explicitly. >>> r.save() # Now it has an ID. >>> r.id 1 # Now the new reporter is in the database. >>> Reporter.objects.all() <QuerySet [<Reporter: John Smith>]> # Fields are represented as attributes on the Python object. >>> r.full_name 'John Smith' # Django provides a rich database lookup API. >>> Reporter.objects.get(id=1) <Reporter: John Smith> >>> Reporter.objects.get(full_name__startswith='John') <Reporter: John Smith> >>> Reporter.objects.get(full_name__contains='mith') <Reporter: John Smith> >>> Reporter.objects.get(id=2) Traceback (most recent call last): ... DoesNotExist: Reporter matching query does not exist. # Create an article. >>> from datetime import date >>> a = Article(pub_date=date.today(), headline='Django is cool', ... content='Yeah.', reporter=r) >>> a.save() # Now the article is in the database. >>> Article.objects.all() <QuerySet [<Article: Django is cool>]> # Article objects get API access to related Reporter objects. >>> r = a.reporter >>> r.full_name 'John Smith' # And vice versa: Reporter objects get API access to Article objects. >>> r.article_set.all() <QuerySet [<Article: Django is cool>]> # The API follows relationships as far as you need, performing efficient # JOINs for you behind the scenes. # This finds all articles by a reporter whose name starts with "John". >>> Article.objects.filter(reporter__full_name__startswith='John') <QuerySet [<Article: Django is cool>]> # Change an object by altering its attributes and calling save(). >>> r.full_name = 'Billy Goat' >>> r.save() # Delete an object with delete(). >>> r.delete()2.1.4 功能強大的動態(tài)admin后臺管理界面
Django包含一個功能強大的admin后臺管理模塊,使用方便,要素齊全。有助于你快速開發(fā)。你只需要在下面兩個文件中寫幾句短短的代碼:
mysite/news/models.py
mysite/news/admin.py
from django.contrib import admin from . import modelsadmin.site.register(models.Article)2.1.5 設計你的路由系統(tǒng)URLs
Django主張干凈、優(yōu)雅的路由設計,不建議在路由中出現(xiàn)類似.php或.asp之類的字眼。
路由都寫在URLconf文件中,它建立起URL匹配模式和python毀掉函數(shù)之間的映射,起到了解耦的作用。下面是一個例子:
mysite/news/urls.py
Django通過正則表達式,分析訪問請求的url地址,匹配相應的views,調(diào)用對應的函數(shù)。
2.1.6 編寫你的視圖views
每一個視圖都必須做下面兩件事情之一:返回一個包含請求頁面數(shù)據(jù)的HttoResponse對象或者彈出一個類似404頁面的異常。
通常,視圖通過參數(shù)獲取數(shù)據(jù),并利用它們渲染加載的模板。下面是一個例子:
mysite/news/views.py
2.1.7 設計你的模板
Django有一個模板查找路徑,在settings文件中,你可以指定路徑列表,Django自動按順序在列表中查找你調(diào)用的模板。一個模板看起來是下面這樣的:
mysite/news/templates/news/year_archive.html
Django使用自己的模板渲染語法,Jinja2就是參考它設計出來的。雙大括號包含起來的是變量,它將被具體的值替換。圓點不但可以用來查詢屬性,也可以用來調(diào)用字典鍵值,列表索引和調(diào)用函數(shù)。
Django具有模板繼承、導入和加載的概念,分別使用extend、include和load語法。下面是一個基礎模板大概的樣子:
mysite/templates/base.html
子模板繼承母模板的內(nèi)容,并加入自己獨有的部分。通過更換母版,可以快速的修改整改站點的外觀和樣式。
2.1.8 總結(jié)
Django為你提供了大量的模塊和組件,包括模板系統(tǒng)、模型系統(tǒng)、視圖系統(tǒng)以及其他一些通用組件和專用組件。他們之間都是獨立的,同時也是可選的,你完全可以使用自己的模板、模型、視圖。但是,Django給你提供的是一個集成度高的高效率整體框架,如果你自己的水平不是很高,那建議還是使用Django提供的吧。
2.2 快速安裝指南
在第三章的第一節(jié)有詳細的安裝指南,這里只是一個簡單的安裝向?qū)?#xff0c;用于快速搭建環(huán)境進入下面的章節(jié)。
2.2.1 安裝Python
Django與python版本的對應關(guān)系。
| 1.8 | 2.7, 3.2 (until the end of 2016), 3.3, 3.4, 3.5 |
| 1.9, 1.10 | 2.7, 3.4, 3.5 |
| 1.11 | 2.7, 3.4, 3.5, 3.6 |
| 2.0 | 3.5+ |
請前往Python官網(wǎng)下載并安裝python。 另外,python和Django自帶輕量級數(shù)據(jù)庫SQLite3,因此,在學習階段你無需安裝并配置其他的數(shù)據(jù)庫。
2.2.2 安裝Django
如果你是通過升級的方式安裝Django,那么你需要先卸載舊的版本,具體查看3.1.4節(jié)。
你可以通過下面的3種方法安裝Django:
- 安裝你的操作系統(tǒng)提供的發(fā)行版本
- 安裝官方版本(推薦)
- 安裝開發(fā)版本
這里,請前往Django官網(wǎng)下載最新版本或通過pip3 install django進行安裝。
下面是Django官方對版本的支持策略:
而這是未來發(fā)布版本的路線圖:
2.2.3 安裝驗證
進入python環(huán)境,輸入下列命令,注意版本號和你新安裝的一致:
>>> import django >>> print(django.get_version()) 1.10或者使用命令$ python -m django --version查看版本號。
下面,我們將進入官方文檔提供的編寫第一個Django app教程!
2.3 第一個Django app,Part 1:請求和響應
在這個例子中,我們將編寫一個問卷調(diào)查網(wǎng)站,它包含下面兩部分:
- 一個可以讓人們進行投票和查看結(jié)果的公開站點
- 一個讓你可以進行增刪改查的后臺admin管理界面
本教程使用Django 1.10 及Python 3.4以上版本!
2.3.1 創(chuàng)建project
進入你指定的某個目錄,運行下面的命令:
$ django-admin startproject mysite
這將在目錄下生成一個mysite目錄,也就是你的這個Django項目的根目錄。它包含了一系列自動生成的目錄和文件,具備各自專有的用途。注意:在給項目命名的時候必須避開Django和Python的保留關(guān)鍵字,比如“django”,“test”等,否則會引起沖突和莫名的錯誤。對于mysite的放置位置,不建議放在傳統(tǒng)的/var/wwww目錄下,它會具有一定的數(shù)據(jù)暴露危險,因此Django建議你將項目文件放在例如/home/mycode類似的位置。
一個新建立的項目結(jié)構(gòu)大概如下:
詳細解釋:
- 外層的mysite/目錄與Django無關(guān),只是你項目的容器,可以任意命名。
- manage.py:一個命令行工具,用于與Django進行不同方式的交互腳本,非常重要!
- 內(nèi)層的mysite/目錄是真正的項目文件包裹目錄,它的名字是你引用內(nèi)部文件的包名,例如:mysite.urls。
- mysite/init.py:一個定義包的空文件。
- mysite/settings.py:項目的主配置文件,非常重要!
- mysite/urls.py:路由文件,所有的任務都是從這里開始分配,相當于Django驅(qū)動站點的內(nèi)容表格,非常重要!
- mysite/wsgi.py:一個基于WSGI的web服務器進入點,提供底層的網(wǎng)絡通信功能,通常不用關(guān)心。
2.3.2 開發(fā)服務器development server
進入mystie目錄,輸入下面的命令:
$ python manage.py runserver
你會看到下面的提示:
Django提供了一個用于開發(fā)的web服務器,使你無需配置一個類似Ngnix的線上服務器,就能讓站點運行起來。但你也不要將開發(fā)服務器用于生產(chǎn)環(huán)境,它只是一個簡易的測試服務器。
現(xiàn)在,在瀏覽器訪問http://127.0.0.1:8000/,你將看到Django的歡迎陰面,一切OK!
django開發(fā)服務器(以后省略)默認運行在內(nèi)部的8000端口,如果你想指定,請在命令中顯示給出,例如:
$ python manage.py runserver 0.0.0.0:8000
上面:Django將運行在8000端口,整個子網(wǎng)內(nèi)都將可以訪問,而不是本機。
注意: Django的開發(fā)服務器具有自動重載功能,當你的代碼有修改,每隔一段時間服務器將自動更新。但是,有一些例如增加文件的動作,不會觸發(fā)服務器重載,這時就需要你自己手動重啟。
2.3.3 創(chuàng)建投票程序(polls app)
app與project的區(qū)別:
- 一個app實現(xiàn)某個功能,比如博客、公共檔案數(shù)據(jù)庫或者簡單的投票系統(tǒng);
- 一個project是配置文件和多個app的集合,他們組合成整個站點;
- 一個project可以包含多個app;
- 一個app可以屬于多個project!
app的存放位置可以是任何地點,但是通常我們將它們都放在與manage.py同級目錄下,這樣方便導入文件。
進入mysite目錄,確保與manage.py文件處于同一級,輸入下述命令:
$ python manage.py startapp polls
系統(tǒng)會自動生成 polls目錄,其結(jié)構(gòu)如下:
2.3.4 編寫視圖
在polls/views.py文件中,輸入下列代碼:
from django.http import HttpResponsedef index(request):return HttpResponse("Hello, world. You're at the polls index.")為了調(diào)用該視圖,我們還需要編寫urlconf?,F(xiàn)在,在polls目錄中新建一個文件,名字為urls.py,在其中輸入代碼如下:
from django.conf.urls import url from . import viewsurlpatterns = [url(r'^$', views.index, name='index'), ]下一步是讓項目的主urls文件指向我們建立的polls這個app獨有的urls文件,你需要先導入include模塊,打開mysite/urls.py文件,代碼如下:
from django.conf.urls import include, url from django.contrib import adminurlpatterns = [url(r'^polls/', include('polls.urls')),url(r'^admin/', admin.site.urls), ]include語法相當于二級路由策略,它將接收到的url地址去除了它前面的正則表達式,將剩下的字符串傳遞給下一級路由進行判斷。在路由的章節(jié),有更加詳細的用法指導。
include的背后是一種即插即用的思想。項目根路由不關(guān)心具體app的路由策略,只管往指定的二級路由轉(zhuǎn)發(fā),實現(xiàn)了解耦的特性。app所屬的二級路由可以根據(jù)自己的需要隨意編寫,不會和其它的app路由發(fā)生沖突。app目錄可以放置在任何位置,而不用修改路由。這是軟件設計里很常見的一種模式。
建議:除了admin路由外,你應該盡量給每個app設計自己獨立的二級路由。
好了,路由也搭建成功,下面我們啟動服務器,然后在瀏覽器中訪問地址http://localhost:8000/polls/。一切正常的話,你將看到“Hello, world. You’re at the polls index.”
url()函數(shù)可以傳遞4個參數(shù),其中2個是必須的:regex和view,以及2個可選的參數(shù):kwargs和name。下面是具體的解釋:
regex:
regex是正則表達式的通用縮寫,它是一種匹配字符串或url地址的語法。Django拿著用戶請求的url地址,在urls.py文件中對urlpatterns列表中的每一項條目從頭開始進行逐一對比,一旦遇到匹配項,立即執(zhí)行該條目映射的視圖函數(shù)或二級路由,其后的條目將不再繼續(xù)匹配。因此,url路由的編寫順序至關(guān)重要!
需要注意的是,regex不會去匹配GET或POST參數(shù)或域名,例如對于https://www.example.com/myapp/,regex只嘗試匹配myapp/。對于https://www.example.com/myapp/?page=3,regex也只嘗試匹配myapp/。
如果你想深入研究正則表達式,可以讀一些相關(guān)的書籍或?qū)U?#xff0c;但是在Django的實踐中,你不需要多高深的正則表達式知識。
性能注釋:正則表達式會進行預先編譯當URLconf模塊加載的時候,因此它的匹配搜索速度非常快,你通常感覺不到。
view:
當正則表達式匹配到某個條目時,自動將封裝的HttpRequest對象作為第一個參數(shù),正則表達式“捕獲”到的值作為第二個參數(shù),傳遞給該條目指定的視圖。如果是簡單捕獲,那么捕獲值將作為一個位置參數(shù)進行傳遞,如果是命名捕獲,那么將作為關(guān)鍵字參數(shù)進行傳遞。
kwargs:
任意數(shù)量的關(guān)鍵字參數(shù)可以作為一個字典傳遞給目標視圖。
name:
對你的URL進行命名,可以讓你能夠在Django的任意處,尤其是模板內(nèi)顯式地引用它。相當于給URL取了個全局變量名,你只需要修改這個全局變量的值,在整個Django中引用它的地方也將同樣獲得改變。這是極為古老、樸素和有用的設計思想,而且這種思想無處不在。
2.4 第一個Django app,Part 2:模型和admin站點
接著上一部分,本節(jié)將講述如何安裝數(shù)據(jù)庫,編寫第一個模型以及簡要的介紹下Django自動生成的admin站點。
2.4.1 數(shù)據(jù)庫安裝
打開mysite/settings.py配置文件。Django默認使用內(nèi)置的SQLite數(shù)據(jù)庫。當然,如果你是在創(chuàng)建一個實際的項目,請使用類似MySql的生產(chǎn)用數(shù)據(jù)庫,避免以后面臨數(shù)據(jù)庫切換的頭疼。
如果你想使用別的數(shù)據(jù)庫,請先安裝相應的數(shù)據(jù)庫模塊,并將settings文件中DATABASES ’default’的鍵值進行相應的修改,用于連接你的數(shù)據(jù)庫。其中:
ENGINE(引擎):可以是’django.db.backends.sqlite3’或者’django.db.backends.postgresql’,’django.db.backends.mysql’, or ’django.db.backends.oracle’,當然其它的也行。
NAME(名稱):數(shù)據(jù)庫的名字。如果你使用的是默認的SQLite,那么數(shù)據(jù)庫將作為一個文件將存放在你的本地機器內(nèi),NAME應該是這個文件的完整絕對路徑,包括文件名。設置中的默認值os.path.join(BASE_DIR, ’db.sqlite3’),將把該文件儲存在你的項目目錄下。
如果你不是使用默認的SQLite數(shù)據(jù)庫,那么一些諸如USER,PASSWORD和HOST的參數(shù)必須手動指定!更多細節(jié)參考后續(xù)的數(shù)據(jù)庫章節(jié)。
注意:
- 在使用非SQLite的數(shù)據(jù)庫時,請務必首先在數(shù)據(jù)庫提示符交互模式下創(chuàng)建數(shù)據(jù)庫,你可以使用命令:“CREATE DATABASE database_name;”。
- 確保你在settings文件中提供的數(shù)據(jù)庫用戶具有創(chuàng)建數(shù)據(jù)庫表的權(quán)限,因為在接下來的教程中,我們需要自動創(chuàng)建一個test數(shù)據(jù)庫。
- 如果你使用的是SQLite,那么你無需做任何預先配置,直接使用就可以了。
在修改settings文件時,請順便將TIME_ZONE設置為你所在的時區(qū)。
同時,請注意settings文件中頂部的INSTALLED_APPS設置項。它保存了所有的在當前項目中被激活的Django應用。你必須將你自定義的app注冊在這里。每個應用可以被多個項目使用,而且你可以打包和分發(fā)給其他人在他們的項目中使用。
默認情況,INSTALLED_APPS中會自動包含下列條目,它們都是Django自動生成的:
- django.contrib.admin:admin站點
- django.contrib.auth:身份認證系統(tǒng)
- django.contrib.contenttypes:內(nèi)容類型框架
- django.contrib.sessions:會話框架
- django.contrib.messages:消息框架
- django.contrib.staticfiles:靜態(tài)文件管理框架
上面的每個應用都至少需要使用一個數(shù)據(jù)庫表,所以在使用它們之前我們需要在數(shù)據(jù)庫中創(chuàng)建這些表。使用這個命令:$ python manage.py migrate。
migrate命令將遍歷INSTALLED_APPS設置中的所有項目,在數(shù)據(jù)庫中創(chuàng)建對應的表,并打印出每一條動作信息。如果你感興趣,可以在你的數(shù)據(jù)庫命令行下輸入:\dt (PostgreSQL), SHOW TABLES; (MySQL), 或 .schema (SQLite) 來列出 Django 所創(chuàng)建的表。
提示:對于極簡主義者,你完全可以在INSTALLED_APPS內(nèi)注釋掉任何或者全部的Django提供的通用應用。這樣,migrate也不會再創(chuàng)建對應的數(shù)據(jù)表。
2.4.2 創(chuàng)建模型models
Django通過自定義python類的形式來定義具體的模型,每個模型代表數(shù)據(jù)庫中的一張表,每個類的實例代表數(shù)據(jù)表中的一行數(shù)據(jù),類中的每個變量代表數(shù)據(jù)表中的一列字段。Django通過ORM對數(shù)據(jù)庫進行操作,奉行代碼優(yōu)先的理念,將python程序員和數(shù)據(jù)庫管理員進行分工解耦。
在這個簡單的投票應用中,我們將創(chuàng)建兩個模型:Question和Choice。Question包含一個問題和一個發(fā)布日期。Choice包含兩個字段:選擇的文本和投票計數(shù)。每一條Choice都關(guān)聯(lián)到一條Question。這些都是由python的類來體現(xiàn),編寫的全是python的代碼,不接觸任何sql語句?,F(xiàn)在,編輯polls/models.py文件,具體代碼如下:
polls/models.py
上面的代碼非常簡單明了。每一個類都是django.db.models.Model的子類。每一個字段都是Field類的一個實例,例如用于保存字符數(shù)據(jù)的CharField和用于保存時間類型的DateTimeField,它們告訴Django每一個字段保存的數(shù)據(jù)類型。
每一個 Field 實例的名字就是字段的名字(如: question_text 或者 pub_date )。在你的Python代碼中會使用這個值,你的數(shù)據(jù)庫也會將這個值作為表的列名。
你也可以在每個Field中使用一個可選的第一位置參數(shù)用于提供一個人類可讀的字段名,讓你的模型更友好,更易讀,并且將被作為文檔的一部分來增強代碼的可讀性。在本例中,僅定義了一個符合人類習慣的字段名Question.pub_date。對于模型中的其他字段,機器名稱就已經(jīng)足夠我們認讀了。
一些Field類必須提供某些特定的參數(shù)。例如CharField需要你指定max_length。這不僅是數(shù)據(jù)庫結(jié)構(gòu)的需要,同樣也用于我們后面會談到的數(shù)據(jù)驗證功能。
有必填參數(shù),當然就會有可選參數(shù),比如在votes里我們將其默認值設為0.
最后請注意,我們使用ForeignKey定義了一個外鍵關(guān)系。它告訴Django,每一個Choice關(guān)聯(lián)到一個對應的Question。Django支持通用的數(shù)據(jù)關(guān)系:一對一,多對一和多對多。
2.4.3 激活模型
上面的代碼看著有點少,但卻給予Django大量的信息,據(jù)此,Django會做下面兩件事:
- 創(chuàng)建該app對應的數(shù)據(jù)庫表結(jié)構(gòu)
- 為Question和Choice對象創(chuàng)建基于python的數(shù)據(jù)庫訪問API
但是,首先,我們得先告訴項目,我們已經(jīng)安裝了投票應用。
Django思想:應用是“可插拔的”:你可以在多個項目使用一個應用,你也可以分發(fā)應用,它們不會被捆綁到一個給定的 Django 項目中。
要將應用添加到項目中,需要在INSTALLED_APPS設置中增加指向該應用的配置文件的鏈接。對于本例的投票應用,它的配置類文件是polls/apps.py,路徑格式為’polls.apps.PollsConfig’。我們需要在INSTALLED_APPS中,將該路徑添加進去。它看起來是這樣的:
mysite/settings.py
INSTALLED_APPS = [ 'polls.apps.PollsConfig', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]現(xiàn)在Django已經(jīng)知道你的投票應用的存在了,并把它加入了大家庭。我們再運行下一個命令:$ python manage.py makemigrations polls。你會看到類似下面的提示:
Migrations for 'polls': polls/migrations/0001_initial.py:- Create model Choice- Create model Question- Add field question to choice通過運行migrations命令,相當于告訴Django你對你的模型有改動,并且你想把這些改動保存為一個“遷移”。
migrations是Django保存模型修改記錄的文件,它們是保存在磁盤上的文件。在例子中,它就是polls/migrations/0001_initial.py文件,你可以打開它看看,里面保存的都是可編輯的內(nèi)容,方便你隨時手動修改。
接下來有一個叫做migrate的命令將對數(shù)據(jù)庫執(zhí)行真正的遷移動作,下面我們就要介紹它。但是,在此之前,讓我們先看看在migration的時候?qū)嶋H試行的SQL語句是什么。有一個叫做sqlmigrate的 命令可以展示sql語句,例如:
$ python manage.py sqlmigrate polls 0001
你將會看到如下類似的文本(經(jīng)過適當?shù)母袷秸{(diào)整,方便閱讀):
BEGIN; -- -- Create model Choice -- CREATE TABLE "polls_choice" ("id" serial NOT NULL PRIMARY KEY,"choice_text" varchar(200) NOT NULL,"votes" integer NOT NULL ); -- -- Create model Question -- CREATE TABLE "polls_question" ("id" serial NOT NULL PRIMARY KEY,"question_text" varchar(200) NOT NULL,"pub_date" timestamp with time zone NOT NULL ); -- -- Add field question to choice -- ALTER TABLE "polls_choice" ADD COLUMN "question_id" integer NOT NULL; ALTER TABLE "polls_choice" ALTER COLUMN "question_id" DROP DEFAULT; CREATE INDEX "polls_choice_7aa0f6ee" ON "polls_choice" ("question_id"); ALTER TABLE "polls_choice"ADD CONSTRAINT "polls_choice_question_id_246c99a640fbbd72_fk_polls_question_id"FOREIGN KEY ("question_id")REFERENCES "polls_question" ("id")DEFERRABLE INITIALLY DEFERRED; COMMIT;請注意:
- 實際的輸出內(nèi)容將取決于您使用的數(shù)據(jù)庫會有所不同。上面的是PostgreSQL的輸出。
- 表名是自動生成的,通過組合應用名 (polls) 和小寫的模型名 – question 和 choice 。 ( 你可以重寫此行為。)
- 主鍵 (IDs) 是自動添加的。( 你也可以重寫此行為。)
- 按照慣例,Django 會在外鍵字段名上附加 "_id" 。 (你仍然可以重寫此行為。)
- 外鍵關(guān)系由FOREIGN KEY顯示聲明。不要擔心DEFERRABLE部分,它只是告訴PostgreSQL不要實施外鍵直到事務結(jié)束。
- 生成 SQL 語句時針對你所使用的數(shù)據(jù)庫,會為你自動處理特定于數(shù)據(jù)庫的字段,例如 auto_increment (MySQL), serial (PostgreSQL), 或integer primary key (SQLite) 。 在引用字段名時也是如此 – 比如使用雙引號或單引號。
- 這些 sql 命令并比較在你的數(shù)據(jù)庫中實際運行,它只是在屏幕上顯示出來,以便讓你了解 Django 真正執(zhí)行的是什么。
如果你感興趣,也可以運行python manage.py check命令,它將檢查項目中所有沒有進行遷移或者鏈接數(shù)據(jù)庫的錯誤。
現(xiàn)在,我們可以運行migrate命令,在數(shù)據(jù)庫中進行真正的表操作了。
$ python manage.py migrate Operations to perform:Apply all migrations: admin, auth, contenttypes, polls, sessions Running migrations:Rendering model states... DONEApplying polls.0001_initial... OKmigrate命令對所有還未實施的遷移記錄進行操作,本質(zhì)上就是將你對模型的修改體現(xiàn)到數(shù)據(jù)庫中具體的表上面。Django通過一張叫做django_migrations的表,記錄并跟蹤已經(jīng)實施的migrate動作,通過對比獲得哪些migrations尚未提交。
migrations的功能非常強大,允許你隨時修改你的模型,而不需要刪除或者新建你的數(shù)據(jù)庫或數(shù)據(jù)表,在不丟失數(shù)據(jù)的同時,實時動態(tài)更新數(shù)據(jù)庫。我們將在后面的章節(jié)對此進行深入的闡述,但是現(xiàn)在,我們只需要記住修改模型時的操作分三步:
- 在models.py中修改模型
- 運行python manage.py makemigrations為改動創(chuàng)建遷移記錄
- 運行python manage.py migrate,將遷移同步到數(shù)據(jù)庫,落實修改動作。
之所以要將創(chuàng)建和實施遷移的動作分成兩個命令兩步走是因為你也許要通過版本控制系統(tǒng)(例如github,svn)提交你的項目代碼,如果沒有一個中間過程的保存文件(migrations),那么github如何知道以及記錄、同步、實施你所進行過的模型修改動作呢?畢竟,github不和數(shù)據(jù)庫直接打交道,也沒法和你本地的數(shù)據(jù)庫打交道。但是分開之后,你只需要將你的migration文件(例如上面的0001)上傳到github,它就會知道一切。
2.4.4 學會使用API
下面,讓我們進入python交互環(huán)境,學習使用Django提供的數(shù)據(jù)庫訪問API。要進入python的shell,請輸入命令:
$ python manage.py shell
相比較直接輸入“python”命令的方式進入python環(huán)境,調(diào)用manage.py參數(shù)能將DJANGO_SETTINGS_MODULE環(huán)境變量導入,它將自動按照mysite/settings.py中的設置,配置好你的python shell環(huán)境,這樣,你就可以導入和調(diào)用任何你項目內(nèi)的模塊了。
或者你也可以這樣,先進入一個純凈的python shell環(huán)境,然后啟動Django,具體如下:
>>> import django >>> django.setup()如果上述操作出現(xiàn)AttributeError異常,有可能是你正在使用一個和當前教程不匹配的Django版本。解決辦法是學習較低版本的教程或更換更新版本的Django。
不管是哪種方式,你最終都是讓python命令能夠找到正確的模塊地址,得到正確的導入。
當你進入shell后,嘗試一下下面的API吧:
>>> from polls.models import Question, Choice # 導入我們寫的模型類# 現(xiàn)在系統(tǒng)內(nèi)還沒有questions>>> Question.objects.all()<QuerySet []># 創(chuàng)建一個新的question# Django推薦使用timezone.now()代替python內(nèi)置的datetime.datetime.now()from django.utils import timezone>>> q = Question(question_text="What's new?", pub_date=timezone.now())# 你必須顯式的調(diào)用save()方法,才能將對象保存到數(shù)據(jù)庫內(nèi)>>> q.save()# 默認情況,你會自動獲得一個自增的名為id的主鍵>>> q.id1# 通過python的屬性調(diào)用方式,訪問模型字段的值>>> q.question_text"What's new?">>> q.pub_datedatetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)# 通過修改屬性來修改字段的值,然后顯式的調(diào)用save方法進行保存。>>> q.question_text = "What's up?">>> q.save()# objects.all() 用于查詢數(shù)據(jù)庫內(nèi)的所有questions>>> Question.objects.all()<QuerySet [<Question: Question object>]>這里等一下:上面的<Question: Question object>是一個不可讀的內(nèi)容展示,你無法從中獲得任何直觀的信息,為此我們需要一點小技巧,讓Django在打印對象時顯示一些我們指定的信息。返回polls/models.py文件,修改一下question和Choice這兩個類,代碼如下:
polls/models.py
from django.db import models from django.utils.encoding import python_2_unicode_compatible@python_2_unicode_compatible # 當你想支持python2版本的時候才需要這個裝飾器 class Question(models.Model):# ...def __str__(self): # 在python2版本中使用的是__unique__return self.question_text@python_2_unicode_compatible class Choice(models.Model):# ...def __str__(self):return self.choice_text這個技巧不但對你打印對象時很有幫助,在你使用Django的admin站點時也同樣有幫助。
請注意,這些都是普通的Python方法。下面我們自定義一個方法,作為示范:
polls/models.py
import datetime from django.db import models from django.utils import timezoneclass Question(models.Model):# ...def was_published_recently(self):return self.pub_date >= timezone.now() - datetime.timedelta(days=1)請注意上面分別導入了兩個關(guān)于時間的模塊,一個是python內(nèi)置的datetime一個是Django工具包提供的timezone。
保存修改后,我們重新啟動一個新的python shell,再來看看其他的API:
>>> from polls.models import Question, Choice# 先看看__str__()的效果,直觀多了吧? >>> Question.objects.all() <QuerySet [<Question: What's up?>]># Django提供了大量的關(guān)鍵字參數(shù)查詢API >>> Question.objects.filter(id=1) <QuerySet [<Question: What's up?>]> >>> Question.objects.filter(question_text__startswith='What') <QuerySet [<Question: What's up?>]># 獲取今年發(fā)布的問卷 >>> from django.utils import timezone >>> current_year = timezone.now().year >>> Question.objects.get(pub_date__year=current_year) <Question: What's up?># 查詢一個不存在的ID,會彈出異常 >>> Question.objects.get(id=2) Traceback (most recent call last): ... DoesNotExist: Question matching query does not exist.# Django為主鍵查詢提供了一個縮寫:pk。下面的語句和Question.objects.get(id=1)效果一樣. >>> Question.objects.get(pk=1) <Question: What's up?># 看看我們自定義的方法用起來怎么樣 >>> q = Question.objects.get(pk=1) >>> q.was_published_recently() True# 讓我們試試主鍵查詢 >>> q = Question.objects.get(pk=1)# 顯示所有與q對象有關(guān)系的choice集合,目前是空的,還沒有任何關(guān)聯(lián)對象。 >>> q.choice_set.all() <QuerySet []># 創(chuàng)建3個choices. >>> q.choice_set.create(choice_text='Not much', votes=0) <Choice: Not much> >>> q.choice_set.create(choice_text='The sky', votes=0) <Choice: The sky> >>> c = q.choice_set.create(choice_text='Just hacking again', votes=0)# Choice對象可通過API訪問和他們關(guān)聯(lián)的Question對象 >>> c.question <Question: What's up?># 同樣的,Question對象也可通過API訪問關(guān)聯(lián)的Choice對象 >>> q.choice_set.all() <QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]> >>> q.choice_set.count() 3# API會自動進行連表操作,通過雙下劃線分割關(guān)系對象。連表操作可以無限多級,一層一層的連接。 # 下面是查詢所有的Choices,它所對應的Question的發(fā)布日期是今年。(重用了上面的current_year結(jié)果) >>> Choice.objects.filter(question__pub_date__year=current_year) <QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]># 使用delete方法刪除對象 >>> c = q.choice_set.filter(choice_text__startswith='Just hacking') >>> c.delete()獲取更多關(guān)于模型關(guān)系的信息,請查看6.15.4章節(jié)。更多的數(shù)據(jù)庫API和如何使用雙下劃線進行查詢,請看3.2.2章節(jié)。
2.4.5 Django admin站點介紹
設計理念:為你的團隊或客戶編寫用于增加、修改和刪除內(nèi)容的admin站點是一件非常乏味的工作并且沒有多少創(chuàng)造性。因此,Django自動地為你通過模型構(gòu)造了一個admin站點。這個站點只給站點管理員使用,并不對大眾開放。
- 創(chuàng)建管理員用戶
首先,通過下面的命令,創(chuàng)建一個可以登錄admin站點的用戶:
$ python manage.py createsuperuser
輸入用戶名:
Username: admin
輸入郵箱地址:
Email address: admin@example.com
輸入密碼:
Password: **********
Password (again): *********
Superuser created successfully.
注意:Django1.10版本后,超級用戶的密碼強制要求具備一定的復雜性,不能再偷懶了。
- 啟動開發(fā)服務器
服務器啟動后,在瀏覽器訪問http://127.0.0.1:8000/admin/。你就能看到admin的登陸界面了:
- 進入admin站點
利用剛才建立的admin賬戶,登陸站點,你將看到如下的界面:
當前已經(jīng)有兩個可編輯的內(nèi)容:groups和users。它們是django.contrib.auth模塊提供的身份認證框架。
- 在admin中注冊你的投票應用
現(xiàn)在你還無法看到你的投票應用,必須先在admin中進行注冊,告訴admin站點,請將poll的模型加入站點內(nèi),接受站點的管理。
打開polls/admin.py文件,加入下面的內(nèi)容:
polls/admin.py
from django.contrib import admin from .models import Questionadmin.site.register(Question)- 瀏覽admin站點的功能
注冊question模型后,刷新admin頁面就能看到Question欄目了。
點擊“Questions”,進入questions的修改列表頁面。這個頁面會顯示所有的數(shù)據(jù)庫內(nèi)的questions對象,你可以在這里對它們進行修改??吹较旅娴摹癢hat’s up?”了么?它就是我們先前創(chuàng)建的一個question,并且通過__str__方法的幫助,顯示了較為直觀的信息,而不是一個冷冰冰的對象類型名稱。
下面,點擊What’s up?進入編輯界面:
這里需要注意的是:
- 表單是由Question模型自動生成的
- 不同的模型字段類型(DateTimeField, CharField)會表現(xiàn)為不同的HTML input框類型。
- 每一個DateTimeField都會獲得一個JS縮寫。日期的縮寫是Today,并有一個日歷彈出框;時間的縮寫是Now,并有一個通用的時間輸入列表框。
在頁面的底部,則是一些可選項按鈕:
- delete:彈出一個刪除確認頁面
- save and add another:保存當前修改,并加載一個新的空白的當前類型對象的表單。
- save and continue editing:保存當前修改,并重新加載該對象的編輯頁面。
- save:保存修改,返回當前對象類型的列表頁面。
如果“Date published”字段的值和你在前面教程創(chuàng)建它的時候不一致,可能是你沒有正確的配置TIME_ZONE,在國內(nèi),通常是8個小時的時間差別。修改TIME_ZONE配置并重新加載頁面,就能顯示正確的時間了。
在頁面的右上角,點擊“History”按鈕,你會看到你對當前對象的所有修改操作都在這里有記錄,包括修改時間和操作人,如下圖所示:
到此,你對模型API和admin站點有了一定的熟悉,可以進入下一階段的教程了。
覺得還行就點贊支持一下吧!
轉(zhuǎn)載于:https://www.cnblogs.com/feixuelove1009/p/5910384.html
總結(jié)
以上是生活随笔為你收集整理的“全能”选手—Django 1.10文档中文版Part1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: freeswitch模块之event_s
- 下一篇: jsonp解析 html