Django基本流程

weixin_33913332發表於2018-07-21

一、Django簡介

Django是用Python開發的一個免費開源的Web框架,可以用於快速搭建高效能,優雅的網站!

初次釋出於2005年7月,並於2008年釋出了第一個正式版本1.0。

二、Django特點

強大的資料庫功能: 擁有強大的資料庫操作介面(QuerySet API),如需要也能執行原生SQL。

自帶強大的後臺: 幾行簡單的程式碼就讓你的網站擁有一個強大的後臺,輕鬆管理內容!

優雅的網址: 用正則匹配網址,傳遞到對應函式,隨意定義,如你所想!

模板系統: 強大,易擴充套件的模板系統,設計簡易,程式碼,樣式分開設計,更容易管理。

(注:前後端分離時,也可以用Django開發API,完全不用模板系統。)

快取系統,與Memcached, Redis等快取系統聯用,更出色的表現,更快的載入速度。

國際化,完全支援多語言應用,允許你定義翻譯的字元,輕鬆翻譯成不同國家的語言。

三、MVC模式

MVC是一種軟體設計典範,用一種業務邏輯、資料、介面顯示分離的方法組織程式碼,將業務邏輯聚集到一個部件中,在改進和個性化定製介面及使用者互動的同時,不需要重新編寫業務邏輯。MVC被獨特的發展起來用於對映傳統的輸入、處理和輸出功能在一個邏輯的圖形化使用者介面的結構中。

1801379-d991f864406db5bd.png

MVC

- Model(模型)

    應用程式中用於處理應用程式資料邏輯部分;

    通常模型物件負責在資料庫中存取資料;

- View(檢視)

    應用程式中處理資料顯示部分;

    通常檢視是依據模型資料建立的;

- Controller(控制器)

    應用程式中處理使用者互動部分;

    通常控制器負責從檢視中讀取資料,控制使用者輸入,並向模型傳送資料;

優點: 降低各個功能模組之間的耦合性,方便變更,更容易重構程式碼,最大程度上實現程式碼的重用。

四、MTV模式

本質上MTV與MVC模式沒有什麼區別,也是各元件之間為了保持鬆耦合關係,只是定義上有些不同。

1801379-7693745bbac386e1.png

MTV


13098540-a0c642a9a3a1e57e.png

- View(檢視)

    負責業務邏輯,並在適當的時候呼叫Model和Template

Django還有一個url分發器,它的作用是將一個個URL的頁面請求分發給不同的view處理,view再呼叫相應的Model和Template。

五、Django環境搭建

Django版本選擇


13098540-64df24908e4549c4.png

pip安裝(如果有直接跳過)

- 下載get-pip.py檔案(Linux, Mac OSX, Windows都可用)https://bootstrap.pypa.io/get-pip.py- 安裝(在終端中執行)    $ python get-pip.py備註:    當Python2.x和Python3.x共存的時候要區分是哪個版本需要安裝;

pip更新(Linux或MacOS): pip install -U pip

pip更新(Windows): python -m pip install -U pip

安裝Django

- 安裝    $ pip install Django==1.11.4- 驗證是否成功()   

進入到python環境(終端中輸入python)

>>> import django

>>> django.get_version()'1.11.4'

六、Django專案建立

新建Django專案:   

$ django-admin startproject projectName目錄層級說明:   

manage.py 一個命令列工具,可以使我們多種方式對Django專案進行互動    projectName/__init__.py 一個空檔案,告訴python這個目錄被看做一個python包(有這個能稱之為包)   

projectName/settings.py 專案的配置檔案   

projectName/urls.py  專案URL宣告   

projectName/wsgi.py    專案與WSGI相容的Web伺服器入口

備註: Linux或Mac下,直接在終端中操作;而在Windows中在cmd中操作(開始 -> 搜尋cmd)

七、設計表結構

班級表

表名: grades欄位: 序號id、班級名gname、開班時間gdate、男生數量gboynum、女生數量ggirlnum、是否刪除isdel

學生表

表名: students欄位: 序號id、學生名sname、性別ssex、年齡sage、班級sclass、簡介sbrief、是否刪除isdel

八、配置資料庫

在__init__中新增兩行程式碼 (確保安裝mysql,另外需要pip3 install pymysql)

importpymysqlpymysql.install_as_MySQLdb()

python3安裝的是PxMysql (和python2是不一樣的)

在settings.py中修改預設資料庫

DATABASES = {'default': {

# 修改為


mysql'ENGINE':'django.db.backends.mysql',

# 必須先建立有對應的資料庫

'NAME':'zyz',

# 使用者名稱

'USER':'root',

# 密碼

'PASSWORD':'123456’,

        # 主機

        'HOST': '127.0.0.1',

        # 埠號

        'POST': '3306’    }}

Django預設使用SQLine資料庫

九、建立應用

要先進入專案目錄下,cd projectName然後執行下面的命令:

$ python3 manage.py startapp appName

專案檔案說明:

    admin.py 站點配置

    models.py 模型

    views.py 檢視

其實一個專案中可以建立多個應用;

十、啟用應用

在settings.py檔案中,將appName應用加入到INSTALL_APPS選項中.

INSTALLED_APPS = ['django.contrib.admin',

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.messages',

'django.contrib.staticfiles',

'appName'# 新增自己的應用]

十一、定義模型

班級表

# 班級表

GradesclassGrades(models.Model)

:# 對應欄位,以及欄位型別

# id          = models.IntegerField()

gname      = models.CharField(max_length=30)   

gdate      = models.DateField()   

gboynum    = models.IntegerField()   

ggirlnum    = models.IntegerField()   

isdel      = models.BooleanField(default=False)

需要引入from django.db import models。模型類要繼承models.Model類。

學生表

# 學生表

StudentsclassStudents(models.Model):

# 自定義模型管理器

studentObj1 = models.Manager()   

studentObj2 = StudentsManager()

# 在沒有新增主鍵時,它會在生成時自動新增主鍵

# id          = models.IntegerField()

sname      = models.CharField(max_length=30)   

ssex        = models.CharField(max_length=10)   

sage        = models.IntegerField()   

sbrief      = models.CharField(max_length=50)  

isdel      = models.BooleanField(default=False)

# 關聯外來鍵(學生都會有一個班級)

sclass = models.ForeignKey('Grades')

十二、資料庫中生成對應表單

生成遷移檔案

$ python3 manage.py makemigrations

備註: 在migrations目錄中生成一個遷移檔案,此時資料庫中還沒生成表單

執行遷移

$ python3 manage.py migrate

備註: 相當於執行了MySQL語句建立了表單(appname_students、appname_grades)

十三、測試資料庫表單操作

- 進入到Python shell   

$ python3 manage.py shell   

- 引入包   

from myapp.models import Grades,Students  

from django.utils import timezone   

from datetime import *

- 查詢所有資料  

Grades.objects.all()   

備註: 在模型類中,其實會有一個隱藏屬性objects-

新增資料(建立物件)

>>> grade = Grades()

>>> grade.gname ='python04'

>>> grade.gdate = datetime(year=2018,month=5,day=27)

>>> grade.gboynum =30>>> grade.ggirlnum =20

>>> grade.save()

# 只有執行儲存,才會往資料庫中插入資料備註: 新增資料本質,就是建立一個模型類的物件例項- 檢視資料(檢視物件)   

Grades.objects.get(pk=1)   

Grades.objects.get(pk=2)

- 修改資料(修改物件屬性)   

g = Grades.objects.get(pk=1)   

g.gboynum =70g.save()   

- 刪除資料   

g.delete()

# 物理刪除,即資料庫中表單資料被刪除

- 關聯物件

# 獲取到班級物件 (pk即是id那個欄位)

>>> grade = Grades.objects.get(pk=2)

# 新增學生物件

>>> stu1 = Students()

>>> stu1.sname ='王大帥'

>>> stu1.ssex ='男'

>>> stu1.sage =18

>>> stu1.sbrief ='我住隔壁,我姓王,你有事情我幫忙'

>>> stu1.sclass = grade

# 這個即是關聯上物件,如果沒有管理,執行save會報錯

>>> stu.save()

>>> stu2 = Students()

>>> stu2.sname ='李花花'

>>> stu2.ssex ='女'

>>> stu2.sage =18

>>> stu2.sbrief ='你負責賺錢養家,我負責貌美如花.'

>>> stu2.sclass = grade

>>> stu2.save()   

- 獲取關聯物件    語法:        物件.關聯的類名小寫_set.all()  

例如:          grade.students_set.all()  

備註: 在班級中,想要獲取某個班級中關聯的學生資訊    需求: python04班級存在,  如何快速關聯上快速建立對應學生?

# 可以直接通過以下方法建立,並且不需要呼叫儲存 (但班級是python04而不是python05)

# 其實就是直接grade和建立的學生物件關聯起來了

stu3 = grade.students_set.create(sname='王八',ssex='男',sage=20,sbrief='哈哈,咬我啊..')

十四、啟動伺服器

語法:python3manage.pyrunserverip:port

例如:python3manage.pyrunserver

備註:IP可以不寫,代表即是本機IP埠號預設是8000   

啟動成功後,在瀏覽器可以看到”Itworked!”

說明:    這是一個純python寫的輕量級web伺服器,僅僅在開發測試階段中使用

十五、Admin站點管理(後臺視覺化介面操作)

概述

內容釋出: 負責新增、修改、刪除內容

公告訪問

配置Admin應用

在`settings.py`檔案中的IINSTALLED_APPS中新增'django.contrib.admin'(預設是已經是新增好的)

建立管理員使用者

$ python3 manage.py createsuperuser

訪問站點管理

語法: ip:埠號/admin

例如: 192.168.0.13:8000/admin

站點管理的漢化版

在settings.py中替換以下內容即可    LANGUAGE_CODE ='en-us'替換 LANGUAGE_CODE ='zh-Hans'TIME_ZONE ='UTC'替換 TIME_ZONE ='Asia/Shanghai'

管理資料表(後臺介面中)

修改admin.py檔案:  

# 引入

from.modelsimportGrades,Students

# 註冊

admin.site.register(Grades)admin.site.register(Students)

自定義管理資料頁面(因為原本頁面顯示不夠友好)

# 自定義管理資料頁面

# 該類需要註冊時新增進去

classGradesAmin(admin.ModelAdmin):

# 列表頁的屬性

# 顯示欄位(需要顯示什麼欄位,就寫上什麼欄位即可)

list_display = ['pk','gname','gdate','gboynum','ggirlnum','isdel']

# 過濾器(過濾欄位)

list_filter = ['gname']

# 搜尋欄位

search_fields = ['pk']# 分頁(多少條為一頁)list_per_page =5

# 新增、修改頁屬性# 屬性的先後順序

fields = ['gboynum','gname','gdate','ggirlnum','isdel']

# 給屬性分組(fields和fieldsets不能同時使用)

fieldsets = [              

('num',{'fields':['gboynum','ggirlnum']}),               

('base',{'fields':['gname','gdate','isdel']}),   

]

# 註冊(以後其實不會在這裡完成註冊,會通過裝飾器完成註冊!)

admin.site.register(Grades,GradesAmin)

自定義管理頁面(關聯物件)

需求: 在建立班級時,可以直接新增幾個學生

# TabularInline 或 StackedInline 兩種顯示方式

classStudentsInfo(admin.TabularInline):

# 要建立學生

model = Students

# 需要建立幾個

extra =1

# 與Grades關聯上

classGradesAmin(admin.ModelAdmin):

# 與上面關聯上inlines = [StudentsInfo]

自定義管理頁面(布林型別的顯示問題)

classStudentsAdmin(admin.ModelAdmin):

defisdel(self):ifself.isdel ==False:return"刪除"

# 設定頁面列的名稱

isdel.short_description ='是否刪除'

自定義管理頁面(執行動作的位置)

# 將動作位置放置底部

classStudentsAdmin(admin.ModelAdmin):

# 執行動作的位置

actions_on_bottom =Trueactions_on_top =False

十六、使用裝飾器完成註冊

# 自定義管理資料頁面@admin.register(Students)classStudentsAdmin(admin.ModelAdmin):

十七、檢視基本使用

概述

在Django中,檢視對web請求進行迴應;檢視其實就是一個python函式,在views.py檔案中定義;

備註: 有幾個頁面就有幾個檢視

定義檢視

fromd  jango.http   import   HttpResponse

# 沒有使用任何的模板

def  index(request):

return    HttpResponse('hello zyz!!!')

配置url (簡單)

# 修改project/urls.py檔案

from  django.conf.urls   import   url,include

from  django.contrib   import   admin

urlpatterns = [    url(r'^admin/', admin.site.urls),   

url(r'^', include('myapp.urls')),# 會定位到myapp.urls中]

# 在對應應用中appname中,建立urls.py檔案(與上面檔案類似)

from  django.conf.urls  import url

from . import views

# 匯入檢視

 urlpatterns = [    url(r'^$', views.index)# 匹配到的就是views中的首頁]

配置url (帶引數)

# 描述(在views.py中定義的檢視)

def   detail(request,num):

return   HttpResponse('detail-%s'% num)

# 在appname/urls.py中配置即可   

urlpatterns = [    url(r'^$', views.index),

# 新增括號,其實就是正規表示式中的組的概念。

# 而匹配到的就是可以給到

detail(request,num)函式中的


numurl(r'^(\d+)/$', views.detail)]

十八、模板的基本使用

概念

模板是HTML頁面,可以根據檢視中傳遞過來的資料進行填充

建立模板目錄

在project中建立模板目錄templates;

在templares目錄中,建立對應應用目錄appname作為專案模板目錄;

建立對應應用app的目錄,因為一個專案可以建立多個app,這也方便對應

配置模板路徑

# 修改settings.py檔案中的TEMPLATES;

TEMPLATES = [{'BACKEND':'django.template.backends.django.DjangoTemplates',

# 新增模板目錄# 開頭部分都有定義BASE_DIR,即專案其實目錄'DIRS': [os.path.join(BASE_DIR,'templates')],'APP_DIRS':True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',        ],    },},]

模板語法

{{輸出值,變數或物件屬性}}

{%執行程式碼段%}

需求1

# 在網址中輸入127.0.0.1/grades時,將所有班級顯示出來# 在網址中輸入127.0.0.1/students時,將所有學生顯示出來- 先建立一個模板(project/templates/appname/)    grades.html    students.html- 模板程式碼(基本頁面顯示)- 建立對應檢視

# 班級頁defgrades(request):pass- url控制器(在myapp/urls.py中分發)    url(r'^grades/$', views.grades),- 檢視中的具體操作

# 班級頁

from.modelsimportGradesdefgrades(request):

# 通過模型取出資料庫中對應表單資料

gradeList = Grades.objects.all()

# 將資料傳遞給模板(模板將資料渲染上之後再返回)

returnrender(request,'myapp/grades.html',{'grades': gradeList})

需求2

# 在班級資訊中點選時,顯示對應班級資訊- 每個班級點選時,URL都會有變化 

  {{grade.gname}}- 匹配不同的檢視  

url(r'^grades/(\d+)$', views.gradeStudents),

# 班級對應學生頁- 檢視中的具體操作

# 對應班級的學生資訊

def gradeStudents(request,gradeid):

# 獲取對應班級物件

grade = Grades.objects.get(pk=gradeid)

# 對應班級的學生studentList = grade.students_set.all()

# 都是學生資訊都是一樣顯示(即模板是一致的)

# 就是資料來源不一樣

returnrender(request,'myapp/students.html',{'students':studentList})

連結:https://www.jianshu.com/p/d3b87efb555d

相關文章