Django入門-2:建立第一個Django專案
建立Django專案
- 命令 django-admin startproject test1
開啟Linux或MacOS的Terminal(終端)直接在終端中輸入這些命令(不是 python 的 shell中)
如果是 windows 用 cmd(開始搜尋 cmd 或者快捷鍵 win + R,輸入 cmd)直接在 cmd 上操作。
django-admin.py startproject project_name
特別是在 windows 上,如果報錯,嘗試用 django-admin 代替 django-admin.py 試試
注意 project_name 是自己的專案名稱,需要為合法的
Python包名,如不能為1a或 a-b。
進入test1目錄,目錄結構如下圖:
Django目錄說明
manage.py:一個命令列工具,可以使你用多種方式對Django專案進行互動
內層的目錄:專案的真正的Python包
_init _.py:一個空檔案,它告訴Python這個目錄應該被看做一個Python包
settings.py:專案的配置
urls.py:專案的URL宣告
wsgi.py:專案與WSGI相容的Web伺服器入口
建立應用【新建app】
- 要先進入專案目錄下,cd project_name 然後執行下面的命令(下同,已經在專案目錄下則不需要 cd project_name
python manage.py startapp app_name
或
django-admin.py startapp app_name
一般一個專案有多個app,當然通用的app也可以在多個專案中使用。
與專案名類似 app name 也需要為合法的Python包名,如 blog,news, aboutus 等都是合法的 app 名稱。
示例:
python manage.py startapp booktest
應用的目錄結構如下圖
資料庫配置
在settings.py檔案中,通過DATABASES項進行資料庫設定
django
支援的資料庫包括:sqlite、mysql等主流資料庫
Django預設使用SQLite資料庫
# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
# DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
# }
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'djangotest',
'USER': 'root',
'PASSWORD': '1234',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
下面解釋一下,裡面引數的意思:
ENGINE : 指定資料庫驅動,不同的資料庫這個欄位不同,下面是常見的集中資料庫的ENGINE的寫法:
django.db.backends.postgresql # PostgreSQL
django.db.backends.mysql # mysql
django.db.backends.sqlite3 # sqlite
django.db.backends.oracle # oracle
NAME: 指定的資料庫名,如果是sqlite的話,就需要填資料庫檔案的絕對位置
USER: 資料庫登入的使用者名稱,mysql一般都是root
PASSWORD:登入資料庫的密碼,必須是USER使用者所對應的密碼
HOST: 由於一般的資料庫都是C/S結構的,所以得指定資料庫伺服器的位置,
我們一般資料庫伺服器和客戶端都是在一臺主機上面,所以一般預設都填127.0.0.1
PORT:資料庫伺服器埠,mysql預設為3306
HOST和PORT都可以不填,使用預設的配置,但是如果你有更改預設配置的話,就需要填入更改後的
配置完這,只是最簡單的一步,下面就需要裝python連線mysql資料庫的驅動程式,
首先,需要安裝mysql的開發包,在shell,裡面執行:
rpm -qa | grep mysql-devel
如果沒有安裝,那就安裝:
sudo yum install mysql-devel
#python2.7:
sudo pip install MySQLdb
#python3.6:
sudo pip install PyMySQL
或者下載mysql驅動
pip install mysqlclient
配置驅動:pymysql.install_as_MySQLdb()
在專案的init檔案中匯入
import pymysql
pymysql.install_as_MySQLdb()
這一步必須要,不然會報錯:找不到mysqldb 包 ,因為django中預設為mysql 驅動包名為MySQLdb ,
但是我們安裝的是 pymysql 所以有這一步
安裝好後,啟動django
python manager.py runserver
如果沒有出現報錯,則表明配置正常,然後在新的shell執行:
python manager.py shell
輸入以下命令:
from django.db import connection
cursor = connection.cursor()
- 如果沒有報錯,則就表明安裝成功,你可以盡情使用django的資料庫功能了
定義模型類
有一個數據表,就有一個模型類與之對應
開啟models.py檔案,定義模型類
引入包from django.db import models
模型類繼承自models.Model類
說明:不需要定義主鍵列,在生成時會自動新增,並且值為自動增長
當輸出物件時,會呼叫物件的str方法
設計介紹
本示例完成“圖書-英雄”資訊的維護,需要儲存兩種資料:圖書、英雄
圖書表結構設計:
表名:BookInfo
圖書名稱:btitle
圖書釋出時間:bpub_date
英雄表結構設計:
表名:HeroInfo
英雄姓名:hname
英雄性別:hgender
英雄簡介:hcontent
所屬圖書:hbook
圖書-英雄的關係為一對多
定義模型【models.py】
from django.db import models
class BookInfo(models.Model):
btitle = models.CharField(max_length=20)
bpub_date = models.DateTimeField()
def __str__(self):
return "%d" % self.pk
class HeroInfo(models.Model):
hname = models.CharField(max_length=20)
hgender = models.BooleanField()
hcontent = models.CharField(max_length=100)
hBook = models.ForeignKey('BookInfo')
def __str__(self):
return "%d" % self.pk
生成資料表
啟用模型:編輯settings.py檔案,將booktest應用加入到installed_apps中
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'booktest',
]
生成遷移檔案:根據模型類生成sql語句
python manage.py makemigrations
遷移檔案被生成到應用的migrations目錄
執行遷移:執行sql語句生成資料表
python manage.py migrate
新建app建立資料庫表 或 更改資料庫表或欄位
Django1.7.1及以上用以下命令
#1.建立更改的檔案
python manage.py makemigrations
#2.將生成的py檔案應用到資料庫
python manage.py migrate
舊版本的Django1.6及以下用
python manage.py syncdb
這種方法可以在SQL等資料庫中建立與models.py程式碼對應的表,不需要自己手動執行SQL。
備註:對已有的 models 進行修改,Django1.7之前的版本的Django都是無法自動更改表結構的,不過有第三方工具 south,
詳見Django資料庫遷移一節。
- 清空資料庫
python manage.py flush
此命令會詢問是 yes 還是 no, 選擇 yes 會把資料全部清空掉,只留下空表。
- 建立超級管理員
python manage.py createsuperuser
#按照提示輸入使用者名稱和對應的密碼就好了郵箱可以留空,使用者名稱和密碼必填
#修改使用者密碼可以用:
python manage.py changepassword username
- 匯出資料 匯入資料
python manage.py dumpdata appname > appname.json
python manage.py loaddata appname.json
關於資料操作詳見:資料匯入資料遷移,現在瞭解有這個用法就可以了
- Django 專案環境終端
python manage.py shell
如果你安裝了 bpython 或 ipython 會自動用它們的介面,推薦安裝 bpython。
這個命令和直接執行 python 或 bpython 進入 shell 的區別是:
你可以在這個 shell 裡面呼叫當前專案的 models.py 中的 API,
對於操作資料,還有一些小測試非常方便。
- 資料庫命令列
python manage.py dbshell
Django會自動進入在settings.py中設定的資料庫,如果是MySQL或 postgreSQL,會要求輸入資料庫使用者密碼。
在這個終端可以執行資料庫的SQL語句。如果您對SQL比較熟悉,可能喜歡這種方式。
- 更多命令
終端上輸入 python manage.py
可以看到詳細的列表,在忘記子名稱的時候特別有用。
Type 'manage.py help <subcommand>' for help on a specific subcommand.
Available subcommands:
[auth]
changepassword
createsuperuser
[contenttypes]
remove_stale_contenttypes
[django]
check
compilemessages
createcachetable
dbshell
diffsettings
dumpdata
flush
inspectdb
loaddata
makemessages
makemigrations
migrate
sendtestemail
shell
showmigrations
sqlflush
sqlmigrate
sqlsequencereset
squashmigrations
startapp
startproject
test
testserver
[sessions]
clearsessions
[staticfiles]
collectstatic
findstatic
runserver
- 測試資料操作
- 進入python shell,進行簡單的模型API練習
python manage.py shell
- 進入python shell,進行簡單的模型API練習
-
- 進入shell後提示如下:
D:\WorkSpace\python\Django\test1>python manage.py shell
Python3.6.1(v3.6.1:69c0db5,Mar212017,18:41:36)[MSC v.190064 bit (AMD64)]
on win32
Type"help","copyright","credits" or "license"for more information.
(InteractiveConsole)
- 進入shell後提示如下:
-
- 引入需要的包:
from booktest.models importBookInfo,HeroInfo
from django.utils import timezone
from datetime import*
- 引入需要的包:
-
- 查詢所有圖書資訊:
BookInfo.objects.all()
- 查詢所有圖書資訊:
-
- 新建圖書資訊:
b =BookInfo()
b.btitle="射鵰英雄傳"
b.bpub_date=datetime(year=1990,month=1,day=10)
b.save()
- 新建圖書資訊:
-
- 查詢圖書資訊:
b=BookInfo.objects.get(pk=1)
- 查詢圖書資訊:
-
- 輸出圖書資訊:
b
b.id
b.btitle
- 輸出圖書資訊:
-
- 修改圖書資訊:
b.btitle=u"天龍八部"
b.save()
- 修改圖書資訊:
-
- 刪除圖書資訊:
b.delete()
- 刪除圖書資訊:
- 關聯物件的操作
- 對於HeroInfo可以按照上面的操作方式進行
- 新增,注意新增關聯物件
h=HeroInfo()
h.htitle=u'郭靖'
h.hgender=True
h.hcontent=u'降龍十八掌'
h.hBook=b
h.save()
-
- 獲得關聯集合:返回當前book物件的所有hero
b.heroinfo_set.all()
返回:
<QuerySet[<HeroInfo:1>]>
- 獲得關聯集合:返回當前book物件的所有hero
-
- 有一個HeroInfo存在,必須要有一個BookInfo物件,提供了建立關聯的資料:
h=b.heroinfo_set.create(htitle=u'黃蓉',hgender=False,hcontent=u'打狗棍法')
- 有一個HeroInfo存在,必須要有一個BookInfo物件,提供了建立關聯的資料:
- 伺服器
- 執行如下命令可以開啟伺服器
python manage.py runserver ip:port
- 執行如下命令可以開啟伺服器
-
- 可以不寫ip,預設埠為8000
- 這是一個純python編寫的輕量級web伺服器,僅在開發階段使用
- 伺服器成功啟動後,提示如下資訊
D:\WorkSpace\python\Django\test1>python manage.py runserver 8080
Performing system checks...
System check identified no issues (0 silenced).
September08,2017-21:30:05
Django version 1.11.5, using settings 'test1.settings'
Starting development server at http://127.0.0.1:8080/
Quit the server with CTRL-BREAK.
[08/Sep/201721:30:16]"GET / HTTP/1.1"2001716
NotFound:/favicon.ico
[08/Sep/201721:30:17]"GET /favicon.ico HTTP/1.1"4041961
-
- 預設埠是8000,可以修改埠
python manage.py runserver 8080
- 預設埠是8000,可以修改埠
-
- 開啟瀏覽器,輸入網址“127.0.0.1:8000”可以開啟預設頁面
-
- 如果修改檔案不需要重啟伺服器,如果增刪檔案需要重啟伺服器
- 通過ctrl+c停止伺服器
- 管理操作
- 站點分為“內容釋出”和“公共訪問”兩部分
- “內容釋出”的部分負責新增、修改、刪除內容,開發這些重複的功能是一件單調乏味、缺乏創造力的工作。
- 為此,Django會根據定義的模型類完全自動地生成管理模組
- 使用django的管理
- 建立一個管理員使用者
python manage.py createsuperuser,按提示輸入使用者名稱、郵箱、密碼
- 建立一個管理員使用者
-
- 啟動伺服器,通過“127.0.0.1:8000/admin”訪問,輸入上面建立的使用者名稱、密碼完成登入
-
- 進入管理站點,預設可以對groups、users進行管理
- 管理介面本地化
- 編輯settings.py檔案,設定編碼、時區
LANGUAGE_CODE ='zh-Hans'
TIME_ZONE ='Asia/Shanghai'
- 編輯settings.py檔案,設定編碼、時區
- 向admin註冊booktest的模型
- 開啟booktest/admin.py檔案,註冊模型
from django.contrib import admin
from models importBookInfo
admin.site.register(BookInfo)
- 開啟booktest/admin.py檔案,註冊模型
-
- 重新整理管理頁面,可以對BookInfo的資料進行增刪改查操作
-
- 問題:如果在str方法中返回中文,在修改和新增時會報ascii的錯誤
- 解決:在str()方法中,將字串末尾新增“.encode('utf-8')”【針對Python2】
- 自定義管理頁面
- Django提供了admin.ModelAdmin類
- 通過定義ModelAdmin的子類,來定義模型在Admin介面的顯示方式
classQuestionAdmin(admin.ModelAdmin):
...
admin.site.register(Question,QuestionAdmin)
- 示例:
-
from django.contrib import admin
from booktest.models importBookInfo
#自定義管理頁面
classBookInfoAdmin(admin.ModelAdmin):
list_display =['pk','btitle','bpub_date']
admin.site.register(BookInfo,BookInfoAdmin)
- 列表頁屬性
- list_display:顯示欄位,可以點選列頭進行排序
list_display =['pk','btitle','bpub_date']
- list_display:顯示欄位,可以點選列頭進行排序
-
- list_filter:過濾欄位,過濾框會出現在右側
list_filter =['btitle']
- list_filter:過濾欄位,過濾框會出現在右側
-
- search_fields:搜尋欄位,搜尋框會出現在上側
search_fields =['btitle']
- search_fields:搜尋欄位,搜尋框會出現在上側
-
-
- list_per_page:分頁,分頁框會出現在下側
list_per_page =10
- list_per_page:分頁,分頁框會出現在下側
- 新增、修改頁屬性
- fields:屬性的先後順序
fields =['bpub_date','btitle']
- fields:屬性的先後順序
-
-
- fieldsets:屬性分組
fieldsets =[
('basic',{'fields':['btitle']}),
('more',{'fields':['bpub_date']}),
]
- fieldsets:屬性分組