python -m django --version
3、建立完後項目的目錄以下:html
4、配置啓動服務器python
點擊edit configurationsmysql
在Host裏面輸入:git
Django的開發服務器(之後簡稱服務器)默認運行在內部的8000端口,若是你想指定端口,請在命令中顯示給出:程序員
python manage.py runserver 8080
若是想修改服務器的ip地址,請按下面的方式運行命令:github
python manage.py runserver 0.0.0.0:8000
python後須要加上版本號,如:python3.68 manage.py runserver 8080正則表達式
5、打開Terminal,輸入以下命令建立APP: sql
python manage.py startapp polls
注意:polls爲APP的名字,能夠本身根據須要修改shell
建立完目錄爲:數據庫
6、編寫視圖
在目錄:polls/views.py中編寫以下代碼:
from django.http import HttpResponse def index(request): return HttpResponse("Hello, world. You're at the polls index.")
爲了調用該視圖,咱們還須要編寫urlconf,也就是路由路徑。如今,在polls目錄中新建一個文件,名字爲urls.py
,在其中輸入代碼以下:
from django.conf.urls import url from . import views urlpatterns = [ url(r'^$', views.index, name='index'), ]
接下來,在項目的主urls文件中添加urlpattern
條目,指向咱們剛纔創建的polls這個app獨有的urls文件,這裏須要導入include模塊。打開djtest/urls.py
文件,代碼以下:
from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ url(r'^polls/', include('polls.urls')), url(r'^admin/', admin.site.urls), ]
include語法至關於多級路由,它把接收到的url地址去除前面的正則表達式,將剩下的字符串傳遞給下一級路由進行判斷。在路由的章節,有更加詳細的用法指導。
include的背後是一種即插即用的思想。項目根路由不關心具體app的路由策略,只管往指定的二級路由轉發,實現了應用解耦。app所屬的二級路由能夠根據本身的須要隨意編寫,不會和其它的app路由發生衝突。app目錄能夠放置在任何位置,而不用修改路由。這是軟件設計裏很常見的一種模式。
建議:除了admin路由外,儘可能給每一個app設計本身獨立的二級路由。
好了,路由設置成功後,啓動服務器,而後在瀏覽器中訪問地址http://localhost:8000/polls/
。一切正常的話,你將看到「Hello, world. You’re at the polls index.」
打開djtest/settings.py
配置文件,這是整個Django項目的設置中心。Django默認使用SQLite數據庫,由於Python源生支持SQLite數據庫,因此你無須安裝任何程序,就能夠直接使用它。固然,若是你是在建立一個實際的項目,可使用相似PostgreSQL的數據庫,避免之後數據庫遷移的相關問題。
若是你想使用其餘的數據庫,請先安裝相應的數據庫操做模塊,並將settings文件中DATABASES位置的’default’
的鍵值進行相應的修改,用於鏈接你的數據庫。其中:
ENGINE(引擎):能夠是django.db.backends.sqlite3
、django.db.backends.postgresql
、django.db.backends.mysql
、django.db.backends.oracle
,固然其它的也行。
NAME(名稱):相似Mysql數據庫管理系統中用於保存項目內容的數據庫的名字。若是你使用的是默認的SQLite,那麼數據庫將做爲一個文件將存放在你的本地機器內,此時的NAME應該是這個文件的完整絕對路徑包括文件名,默認值os.path.join(BASE_DIR, ’db.sqlite3’)
,將把該文件儲存在你的項目目錄下。
若是你不是使用默認的SQLite數據庫,那麼一些諸如USER,PASSWORD和HOST的參數必須手動指定!下面給出一個基於pymysql操做Mysql數據庫的例子,更多細節參考後續的數據庫章節。
# mysite/settings.py # Database # https://docs.djangoproject.com/en/1.11/ref/settings/#databases import pymysql # 必定要添加這兩行!經過pip install pymysql! pymysql.install_as_MySQLdb() DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mysite', 'HOST': '192.168.1.1', 'USER': 'root', 'PASSWORD': 'pwd', 'PORT': '3306', } }
在修改settings文件時,請順便將TIME_ZONE
設置爲國內所在的時區Asia/Shanghai
。
同時,請注意settings文件中頂部的INSTALLED_APPS
設置項。它列出了全部的項目中被激活的Django應用(app)。你必須將你自定義的app註冊在這裏。每一個應用能夠被多個項目使用,而且能夠打包和分發給其餘人在他們的項目中使用。
默認狀況,INSTALLED_APPS
中會自動包含下列條目,它們都是Django自動生成的:
上面的一些應用也須要創建一些數據庫表,因此在使用它們以前咱們要在數據庫中建立這些表。使用下面的命令建立數據表:
python manage.py migrate
migrate命令將遍歷INSTALLED_APPS
設置中的全部項目,在數據庫中建立對應的表,並打印出每一條動做信息。若是你感興趣,能夠在你的數據庫命令行下輸入:\dt
(PostgreSQL)、 SHOW TABLES;
(MySQL)或 .schema
(SQLite) 來列出 Django 所建立的表。
提示:對於極簡主義者,你徹底能夠在INSTALLED_APPS內註釋掉任何或者所有的Django提供的通用應用。這樣,migrate也不會再建立對應的數據表。
如今,咱們來定義模型model,模型本質上就是數據庫表的佈局,再附加一些元數據。
Django經過自定義Python類的形式來定義具體的模型,每一個模型的物理存在方式就是一個Python的類Class,每一個模型表明數據庫中的一張表,每一個類的實例表明數據表中的一行數據,類中的每一個變量表明數據表中的一列字段。Django經過模型,將Python代碼和數據庫操做結合起來,實現對SQL查詢語言的封裝。也就是說,你能夠不會管理數據庫,能夠不會SQL語言,你一樣能經過Python的代碼進行數據庫的操做。Django經過ORM對數據庫進行操做,奉行代碼優先的理念,將Python程序員和數據庫管理員進行分工解耦。
在這個簡單的投票應用中,咱們將建立兩個模型:Question
和Choice
。Question包含一個問題和一個發佈日期。Choice包含兩個字段:該選項的文本描述和該選項的投票數。每一條Choice都關聯到一個Question。這些都是由Python的類來體現,編寫的全是Python的代碼,不接觸任何SQL語句。如今,編輯polls/models.py
文件,具體代碼以下:
from django.db import models class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') class Choice(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0)
上面的代碼很是簡單明瞭。每個類都是django.db.models.Model
的子類。每個字段都是Field
類的一個實例,例如用於保存字符數據的CharField和用於保存時間類型的DateTimeField,它們告訴Django每個字段保存的數據類型。
每個Field實例的名字就是字段的名字(如: question_text 或者 pub_date )。在你的Python代碼中會使用這個值,你的數據庫也會將這個值做爲表的列名。
你也能夠在每一個Field中使用一個可選的第一位置參數用於提供一我的類可讀的字段名,讓你的模型更友好,更易讀,而且將被做爲文檔的一部分來加強代碼的可讀性。
一些Field類必須提供某些特定的參數。例如CharField須要你指定max_length。這不只是數據庫結構的須要,一樣也用於數據驗證功能。
有必填參數,固然就會有可選參數,好比在votes裏咱們將其默認值設爲0.
最後請注意,咱們使用ForeignKey
定義了一個外鍵關係。它告訴Django,每個Choice關聯到一個對應的Question(注意要將外鍵寫在‘多’的一方)。Django支持通用的數據關係:一對一,多對一和多對多。
上面的代碼看着有點少,其實包含了大量的信息,據此,Django會作下面兩件事:
可是,首先咱們得先告訴Django項目,咱們要使用投票app。
要將應用添加到項目中,須要在INSTALLED_APPS
設置中增長指向該應用的配置文件的連接。對於本例的投票應用,它的配置類文件是polls/apps.py
,路徑格式爲polls.apps.PollsConfig
。咱們須要在INSTALLED_APPS
中,將該路徑添加進去:
# djtest/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',
實際上,在多數狀況下,咱們簡寫成‘polls’就能夠了:
# djtest/settings.py INSTALLED_APPS = [ 'polls', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]
如今Django已經知道你的投票應用的存在了,並把它加入了項目你們庭。
咱們須要再運行下一個命令:
python manage.py makemigrations polls
你會看到相似下面的提示:
Migrations for 'polls': polls/migrations/0001_initial.py: - Create model Choice - Create model Question - Add field question to choice
經過運行makemigrations
命令,至關於告訴Django你對模型有改動,而且你想把這些改動保存爲一個「遷移(migration)」。
migrations
是Django保存模型修改記錄的文件,這些文件保存在磁盤上。在例子中,它就是polls/migrations/0001_initial.py
,你能夠打開它看看,裏面保存的都是人類可讀而且可編輯的內容,方便你隨時手動修改。
接下來有一個叫作migrate
的命令將對數據庫執行真正的遷移動做。可是在此以前,讓咱們先看看在migration的時候實際執行的SQL語句是什麼。有一個叫作sqlmigrate
的命令能夠展現SQL語句,例如:
python manage.py sqlmigrate polls 0001
你將會看到以下相似的文本(通過適當的格式調整,方便閱讀)
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;
請注意:
question
和choice
。 ( 你能夠重寫此行爲。)若是你感興趣,也能夠運行python manage.py check
命令,它將檢查項目中的錯誤,並不實際進行遷移或者連接數據庫的操做。
如今,咱們能夠運行migrate命令,在數據庫中進行真正的表操做了。
migrations的功能很是強大,容許你隨時修改你的模型,而不須要刪除或者新建你的數據庫或數據表,在不丟失數據的同時,實時動態更新數據庫。咱們將在後面的章節對此進行深刻的闡述,可是如今,只須要記住修改模型時的操做分三步:
python manage.py makemigrations
爲改動建立遷移記錄;python manage.py migrate
,將操做同步到數據庫。之因此要將建立和實施遷移的動做分紅兩個命令兩步走是由於你也許要經過版本控制系統(例如github,svn)提交你的項目代碼,若是沒有一箇中間過程的保存文件(migrations),那麼github如何知道以及記錄、同步、實施你所進行過的模型修改動做呢?畢竟,github不和數據庫直接打交道,也無法和你本地的數據庫通訊。可是分開以後,你只須要將你的migration文件(例如上面的0001)上傳到github,它就會知道一切。
python manage.py shell
M 表明模型(Model):負責業務對象和數據庫的關係映射(ORM)。
T 表明模板 (Template):負責如何把頁面展現給用戶(html)。
V 表明視圖(View):負責業務邏輯,並在適當時候調用Model和Template。
下面,打開polls/views.py
文件,輸入下列代碼:
def detail(request, question_id): return HttpResponse("You're looking at question %s." % question_id) def results(request, question_id): response = "You're looking at the results of question %s." return HttpResponse(response % question_id) def vote(request, question_id): return HttpResponse("You're voting on question %s." % question_id)