1. 程式人生 > >Django入門-2:建立第一個Django專案

Django入門-2:建立第一個Django專案

建立Django專案

  • 命令 django-admin startproject test1
  • 開啟LinuxMacOSTerminal(終端)直接在終端中輸入這些命令(不是 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包名,如 blognews, aboutus 等都是合法的 app 名稱。

示例:

python manage.py startapp booktest

應用的目錄結構如下圖

應用的目錄結構

資料庫配置

settings.py檔案中,通過DATABASES項進行資料庫設定

django

支援的資料庫包括:sqlitemysql等主流資料庫

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 

HOSTPORT都可以不填,使用預設的配置,但是如果你有更改預設配置的話,就需要填入更改後的

配置完這,只是最簡單的一步,下面就需要裝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的資料庫功能了

定義模型類

  1. 有一個數據表,就有一個模型類與之對應
  2. 開啟models.py檔案,定義模型類
  3. 引入包from django.db import models
  4. 模型類繼承自models.Model
  5. 說明:不需要定義主鍵列,在生成時會自動新增,並且值為自動增長
  6. 當輸出物件時,會呼叫物件的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資料庫遷移一節。

  • 清空資料庫
    1. python manage.py flush
    2. 此命令會詢問是 yes 還是 no, 選擇 yes 會把資料全部清空掉,只留下空表。
  • 建立超級管理員
    1. python manage.py createsuperuser
    2. #按照提示輸入使用者名稱和對應的密碼就好了郵箱可以留空,使用者名稱和密碼必填
    3. #修改使用者密碼可以用:
    4. python manage.py changepassword username
  • 匯出資料 匯入資料
    1. python manage.py dumpdata appname > appname.json
    2. python manage.py loaddata appname.json
    3. 關於資料操作詳見:資料匯入資料遷移,現在瞭解有這個用法就可以了
  • Django 專案環境終端
    1. python manage.py shell
    2. 如果你安裝了 bpython ipython 會自動用它們的介面,推薦安裝 bpython
      1. 這個命令和直接執行 python bpython 進入 shell 的區別是:
      2. 可以在這個 shell 裡面呼叫當前專案的 models.py 中的 API
      3. 對於操作資料,還有一些小測試非常方便。
  • 資料庫命令列
    1. python manage.py dbshell
    2. Django會自動進入在settings.py中設定的資料庫,如果是MySQL postgreSQL,會要求輸入資料庫使用者密碼。
    3. 在這個終端可以執行資料庫的SQL語句。如果您對SQL比較熟悉,可能喜歡這種方式。
  • 更多命令
    1. 終端上輸入 python manage.py 
    2. 可以看到詳細的列表,在忘記子名稱的時候特別有用。
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練習
      1. python manage.py shell
    • 進入shell後提示如下:
      1. D:\WorkSpace\python\Django\test1>python manage.py shell
      2. Python3.6.1(v3.6.1:69c0db5,Mar212017,18:41:36)[MSC v.190064 bit (AMD64)]
      3. on win32
      4. Type"help","copyright","credits" or "license"for more information.
      5. (InteractiveConsole)
    • 引入需要的包:
      1. from booktest.models importBookInfo,HeroInfo
      2. from django.utils import timezone
      3. from datetime import*
    • 查詢所有圖書資訊:
      1. BookInfo.objects.all()
    • 新建圖書資訊:
      1. b =BookInfo()
      2. b.btitle="射鵰英雄傳"
      3. b.bpub_date=datetime(year=1990,month=1,day=10)
      4. b.save()
    • 查詢圖書資訊:
      1. b=BookInfo.objects.get(pk=1)
    • 輸出圖書資訊:
      1. b
      2. b.id
      3. b.btitle
    • 修改圖書資訊:
      1. b.btitle=u"天龍八部"
      2. b.save()
    • 刪除圖書資訊:
      1. b.delete()
  • 關聯物件的操作
    • 對於HeroInfo可以按照上面的操作方式進行
    • 新增,注意新增關聯物件
      1. h=HeroInfo()
      2. h.htitle=u'郭靖'
      3. h.hgender=True
      4. h.hcontent=u'降龍十八掌'
      5. h.hBook=b
      6. h.save()
    • 獲得關聯集合:返回當前book物件的所有hero
      1. b.heroinfo_set.all()
        1. 返回:
        2. <QuerySet[<HeroInfo:1>]>
    • 有一個HeroInfo存在,必須要有一個BookInfo物件,提供了建立關聯的資料:
      1. h=b.heroinfo_set.create(htitle=u'黃蓉',hgender=False,hcontent=u'打狗棍法')
  • 伺服器
    • 執行如下命令可以開啟伺服器
      1. python manage.py runserver ip:port
    • 可以不寫ip,預設埠為8000
    • 這是一個純python編寫的輕量級web伺服器,僅在開發階段使用
    • 伺服器成功啟動後,提示如下資訊
      1. D:\WorkSpace\python\Django\test1>python manage.py runserver 8080
      2. Performing system checks...
      3. System check identified no issues (0 silenced).
      4. September08,2017-21:30:05
      5. Django version 1.11.5, using settings 'test1.settings'
      6. Starting development server at http://127.0.0.1:8080/
      7. Quit the server with CTRL-BREAK.
      8. [08/Sep/201721:30:16]"GET / HTTP/1.1"2001716
      9. NotFound:/favicon.ico
      10. [08/Sep/201721:30:17]"GET /favicon.ico HTTP/1.1"4041961
    • 預設埠是8000,可以修改埠
      1. python manage.py runserver 8080
    • 開啟瀏覽器,輸入網址“127.0.0.1:8000”可以開啟預設頁面 

 

    • 如果修改檔案不需要重啟伺服器,如果增刪檔案需要重啟伺服器
    • 通過ctrl+c停止伺服器
  • 管理操作
    • 站點分為“內容釋出”和“公共訪問”兩部分
    • 內容釋出”的部分負責新增、修改、刪除內容,開發這些重複的功能是一件單調乏味、缺乏創造力的工作。
    • 為此,Django會根據定義的模型類完全自動地生成管理模組
  • 使用django的管理
    • 建立一個管理員使用者
      1. python manage.py createsuperuser,按提示輸入使用者名稱、郵箱、密碼
    • 啟動伺服器,通過“127.0.0.1:8000/admin”訪問,輸入上面建立的使用者名稱、密碼完成登入

    • 進入管理站點,預設可以對groups、users進行管理
  • 管理介面本地化
    • 編輯settings.py檔案,設定編碼、時區
      1. LANGUAGE_CODE ='zh-Hans'
      2. TIME_ZONE ='Asia/Shanghai'
  • 向admin註冊booktest的模型
    • 開啟booktest/admin.py檔案,註冊模型
      1. from django.contrib import admin
      2. from models importBookInfo
      3. admin.site.register(BookInfo)
    • 重新整理管理頁面,可以對BookInfo的資料進行增刪改查操作

    • 問題:如果在str方法中返回中文,在修改和新增時會報ascii的錯誤
    • 解決:在str()方法中,將字串末尾新增“.encode('utf-8')”【針對Python2】
  • 自定義管理頁面
    • Django提供了admin.ModelAdmin類
    • 通過定義ModelAdmin的子類,來定義模型在Admin介面的顯示方式
      1. classQuestionAdmin(admin.ModelAdmin):
      2. ...
      3. admin.site.register(Question,QuestionAdmin)
      4. 示例:
        1. from django.contrib import admin
        2. from booktest.models importBookInfo
        3. #自定義管理頁面
        4. classBookInfoAdmin(admin.ModelAdmin):
        5. list_display =['pk','btitle','bpub_date']
        6. admin.site.register(BookInfo,BookInfoAdmin)
    • 列表頁屬性
      • list_display:顯示欄位,可以點選列頭進行排序
        1. list_display =['pk','btitle','bpub_date']
    • list_filter:過濾欄位,過濾框會出現在右側
      1. list_filter =['btitle']
    • search_fields:搜尋欄位,搜尋框會出現在上側
      1. search_fields =['btitle']
      • list_per_page:分頁,分頁框會出現在下側
        1. list_per_page =10
    • 新增、修改頁屬性
      • fields:屬性的先後順序
        1. fields =['bpub_date','btitle']
    • fieldsets:屬性分組
      1. fieldsets =[
      2. ('basic',{'fields':['btitle']}),
      3. ('more',{'fields':['bpub_date']}),
      4. ]