Django基本流程

一、Django簡介

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

初次發布于2005年7月,并于2008年發布了第一個正式版本1.0。

二、Django特點

強大的數據庫功能: 擁有強大的數據庫操作接口(QuerySet API),如需要也能執行原生SQL。

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

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

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

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

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

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

三、MVC模式

MVC是一種軟件設計典范,用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯聚集到一個部件中,在改進和個性化定制界面及用戶交互的同時,不需要重新編寫業務邏輯。MVC被獨特的發展起來用于映射傳統的輸入、處理和輸出功能在一個邏輯的圖形化用戶界面的結構中。

MVC

- Model(模型)

? ? 應用程序中用于處理應用程序數據邏輯部分;

? ? 通常模型對象負責在數據庫中存取數據;

- View(視圖)

? ? 應用程序中處理數據顯示部分;

? ? 通常視圖是依據模型數據創建的;

- Controller(控制器)

? ? 應用程序中處理用戶交互部分;

? ? 通常控制器負責從視圖中讀取數據,控制用戶輸入,并向模型發送數據;

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

四、MTV模式

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

MTV


- View(視圖)

? ? 負責業務邏輯,并在適當的時候調用Model和Template

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

五、Django環境搭建

Django版本選擇


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})

鏈接:http://www.lxweimin.com/p/d3b87efb555d

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,743評論 2 370

推薦閱讀更多精彩內容

  • 切換到創建項目的目錄 cd C:\Users\admin\Desktop\DjangoProject創建名為pr...
    在努力中閱讀 3,290評論 2 3
  • 模塊間聯系越多,其耦合性越強,同時表明其獨立性越差( 降低耦合性,可以提高其獨立性)。軟件設計中通常用耦合度和內聚...
    riverstation閱讀 2,080評論 0 8
  • 一、Django簡介 Django是用Python開發的一個免費開源的Web框架,可以用于快速搭建高性能,優雅的網...
    EndEvent閱讀 2,469評論 1 2
  • Web框架之Django: (1)簡介: Django是一個由Python寫成開源的重量級Web應用框架,采用MT...
    老肖閱讀 3,071評論 0 18
  • virtualenv newenv => 新的虛擬環境 source newenv/bin...
    xiaohesong閱讀 287評論 0 0