Django基本流程

一、Django簡介

Django是用Python開發(fā)的一個免費開源的Web框架,可以用于快速搭建高性能,優(yōu)雅的網(wǎng)站!

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

二、Django特點

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

自帶強大的后臺: 幾行簡單的代碼就讓你的網(wǎng)站擁有一個強大的后臺,輕松管理內(nèi)容!

優(yōu)雅的網(wǎng)址: 用正則匹配網(wǎng)址,傳遞到對應(yīng)函數(shù),隨意定義,如你所想!

模板系統(tǒng): 強大,易擴展的模板系統(tǒng),設(shè)計簡易,代碼,樣式分開設(shè)計,更容易管理。

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

緩存系統(tǒng),與Memcached, Redis等緩存系統(tǒng)聯(lián)用,更出色的表現(xiàn),更快的加載速度。

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

三、MVC模式

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

MVC

- Model(模型)

? ? 應(yīng)用程序中用于處理應(yīng)用程序數(shù)據(jù)邏輯部分;

? ? 通常模型對象負責(zé)在數(shù)據(jù)庫中存取數(shù)據(jù);

- View(視圖)

? ? 應(yīng)用程序中處理數(shù)據(jù)顯示部分;

? ? 通常視圖是依據(jù)模型數(shù)據(jù)創(chuàng)建的;

- Controller(控制器)

? ? 應(yīng)用程序中處理用戶交互部分;

? ? 通??刂破髫撠?zé)從視圖中讀取數(shù)據(jù),控制用戶輸入,并向模型發(fā)送數(shù)據(jù);

優(yōu)點: 降低各個功能模塊之間的耦合性,方便變更,更容易重構(gòu)代碼,最大程度上實現(xiàn)代碼的重用。

四、MTV模式

本質(zhì)上MTV與MVC模式?jīng)]有什么區(qū)別,也是各組件之間為了保持松耦合關(guān)系,只是定義上有些不同。

MTV


- View(視圖)

? ? 負責(zé)業(yè)務(wù)邏輯,并在適當(dāng)?shù)臅r候調(diào)用Model和Template

Django還有一個url分發(fā)器,它的作用是將一個個URL的頁面請求分發(fā)給不同的view處理,view再調(diào)用相應(yīng)的Model和Template。

五、Django環(huán)境搭建

Django版本選擇


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

- 下載get-pip.py文件(Linux, Mac OSX, Windows都可用)https://bootstrap.pypa.io/get-pip.py- 安裝(在終端中運行)? ? $ python get-pip.py備注:? ? 當(dāng)Python2.x和Python3.x共存的時候要區(qū)分是哪個版本需要安裝;

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

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

安裝Django

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

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

>>> import django

>>> django.get_version()'1.11.4'

六、Django項目創(chuàng)建

新建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服務(wù)器入口

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

七、設(shè)計表結(jié)構(gòu)

班級表

表名: grades字段: 序號id、班級名gname、開班時間gdate、男生數(shù)量gboynum、女生數(shù)量ggirlnum、是否刪除isdel

學(xué)生表

表名: students字段: 序號id、學(xué)生名sname、性別ssex、年齡sage、班級sclass、簡介sbrief、是否刪除isdel

八、配置數(shù)據(jù)庫

在__init__中添加兩行代碼 (確保安裝mysql,另外需要pip3 install pymysql)

importpymysqlpymysql.install_as_MySQLdb()

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

在settings.py中修改默認數(shù)據(jù)庫

DATABASES = {'default': {

# 修改為


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

# 必須先創(chuàng)建有對應(yīng)的數(shù)據(jù)庫

'NAME':'zyz',

# 用戶名

'USER':'root',

# 密碼

'PASSWORD':'123456’,

? ? ? ? # 主機

? ? ? ? 'HOST': '127.0.0.1',

? ? ? ? # 端口號

? ? ? ? 'POST': '3306’? ? }}

Django默認使用SQLine數(shù)據(jù)庫

九、創(chuàng)建應(yīng)用

要先進入項目目錄下,cd projectName然后執(zhí)行下面的命令:

$ python3 manage.py startapp appName

項目文件說明:

? ? admin.py 站點配置

? ? models.py 模型

? ? views.py 視圖

其實一個項目中可以創(chuàng)建多個應(yīng)用;

十、激活應(yīng)用

在settings.py文件中,將appName應(yīng)用加入到INSTALL_APPS選項中.

INSTALLED_APPS = ['django.contrib.admin',

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.messages',

'django.contrib.staticfiles',

'appName'# 添加自己的應(yīng)用]

十一、定義模型

班級表

# 班級表

GradesclassGrades(models.Model)

:# 對應(yīng)字段,以及字段類型

# 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類。

學(xué)生表

# 學(xué)生表

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)

# 關(guān)聯(lián)外鍵(學(xué)生都會有一個班級)

sclass = models.ForeignKey('Grades')

十二、數(shù)據(jù)庫中生成對應(yīng)表單

生成遷移文件

$ python3 manage.py makemigrations

備注: 在migrations目錄中生成一個遷移文件,此時數(shù)據(jù)庫中還沒生成表單

執(zhí)行遷移

$ python3 manage.py migrate

備注: 相當(dāng)于執(zhí)行了MySQL語句創(chuàng)建了表單(appname_students、appname_grades)

十三、測試數(shù)據(jù)庫表單操作

- 進入到Python shell? ?

$ python3 manage.py shell? ?

- 引入包? ?

from myapp.models import Grades,Students??

from django.utils import timezone? ?

from datetime import *

- 查詢所有數(shù)據(jù)??

Grades.objects.all()? ?

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

添加數(shù)據(jù)(創(chuàng)建對象)

>>> grade = Grades()

>>> grade.gname ='python04'

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

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

>>> grade.save()

# 只有執(zhí)行保存,才會往數(shù)據(jù)庫中插入數(shù)據(jù)備注: 添加數(shù)據(jù)本質(zhì),就是創(chuàng)建一個模型類的對象實例- 查看數(shù)據(jù)(查看對象)? ?

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

Grades.objects.get(pk=2)

- 修改數(shù)據(jù)(修改對象屬性)? ?

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

g.gboynum =70g.save()? ?

- 刪除數(shù)據(jù)? ?

g.delete()

# 物理刪除,即數(shù)據(jù)庫中表單數(shù)據(jù)被刪除

- 關(guān)聯(lián)對象

# 獲取到班級對象 (pk即是id那個字段)

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

# 添加學(xué)生對象

>>> stu1 = Students()

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

>>> stu1.ssex ='男'

>>> stu1.sage =18

>>> stu1.sbrief ='我住隔壁,我姓王,你有事情我?guī)兔?

>>> stu1.sclass = grade

# 這個即是關(guān)聯(lián)上對象,如果沒有管理,執(zhí)行save會報錯

>>> stu.save()

>>> stu2 = Students()

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

>>> stu2.ssex ='女'

>>> stu2.sage =18

>>> stu2.sbrief ='你負責(zé)賺錢養(yǎng)家,我負責(zé)貌美如花.'

>>> stu2.sclass = grade

>>> stu2.save()? ?

- 獲取關(guān)聯(lián)對象? ? 語法:? ? ? ? 對象.關(guān)聯(lián)的類名小寫_set.all()??

例如:? ? ? ? ? grade.students_set.all()??

備注: 在班級中,想要獲取某個班級中關(guān)聯(lián)的學(xué)生信息? ? 需求: python04班級存在,? 如何快速關(guān)聯(lián)上快速創(chuàng)建對應(yīng)學(xué)生?

# 可以直接通過以下方法創(chuàng)建,并且不需要調(diào)用保存 (但班級是python04而不是python05)

# 其實就是直接grade和創(chuàng)建的學(xué)生對象關(guān)聯(lián)起來了

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

十四、啟動服務(wù)器

語法:python3manage.pyrunserverip:port

例如:python3manage.pyrunserver

備注:IP可以不寫,代表即是本機IP端口號默認是8000? ?

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

說明:? ? 這是一個純python寫的輕量級web服務(wù)器,僅僅在開發(fā)測試階段中使用

十五、Admin站點管理(后臺可視化界面操作)

概述

內(nèi)容發(fā)布: 負責(zé)添加、修改、刪除內(nèi)容

公告訪問

配置Admin應(yīng)用

在`settings.py`文件中的IINSTALLED_APPS中添加'django.contrib.admin'(默認是已經(jīng)是添加好的)

創(chuàng)建管理員用戶

$ python3 manage.py createsuperuser

訪問站點管理

語法: ip:端口號/admin

例如: 192.168.0.13:8000/admin

站點管理的漢化版

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

管理數(shù)據(jù)表(后臺界面中)

修改admin.py文件:??

# 引入

from.modelsimportGrades,Students

# 注冊

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

自定義管理數(shù)據(jù)頁面(因為原本頁面顯示不夠友好)

# 自定義管理數(shù)據(jù)頁面

# 該類需要注冊時添加進去

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)

自定義管理頁面(關(guān)聯(lián)對象)

需求: 在創(chuàng)建班級時,可以直接添加幾個學(xué)生

# TabularInline 或 StackedInline 兩種顯示方式

classStudentsInfo(admin.TabularInline):

# 要創(chuàng)建學(xué)生

model = Students

# 需要創(chuàng)建幾個

extra =1

# 與Grades關(guān)聯(lián)上

classGradesAmin(admin.ModelAdmin):

# 與上面關(guān)聯(lián)上inlines = [StudentsInfo]

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

classStudentsAdmin(admin.ModelAdmin):

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

# 設(shè)置頁面列的名稱

isdel.short_description ='是否刪除'

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

# 將動作位置放置底部

classStudentsAdmin(admin.ModelAdmin):

# 執(zhí)行動作的位置

actions_on_bottom =Trueactions_on_top =False

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

# 自定義管理數(shù)據(jù)頁面@admin.register(Students)classStudentsAdmin(admin.ModelAdmin):

十七、視圖基本使用

概述

在Django中,視圖對web請求進行回應(yīng);視圖其實就是一個python函數(shù),在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中]

# 在對應(yīng)應(yīng)用中appname中,創(chuàng)建urls.py文件(與上面文件類似)

from? django.conf.urls? import url

from . import views

# 導(dǎo)入視圖

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

配置url (帶參數(shù))

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

def?? detail(request,num):

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

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

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

# 添加括號,其實就是正則表達式中的組的概念。

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

detail(request,num)函數(shù)中的


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

十八、模板的基本使用

概念

模板是HTML頁面,可以根據(jù)視圖中傳遞過來的數(shù)據(jù)進行填充

創(chuàng)建模板目錄

在project中創(chuàng)建模板目錄templates;

在templares目錄中,創(chuàng)建對應(yīng)應(yīng)用目錄appname作為項目模板目錄;

創(chuàng)建對應(yīng)應(yīng)用app的目錄,因為一個項目可以創(chuàng)建多個app,這也方便對應(yīng)

配置模板路徑

# 修改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',? ? ? ? ],? ? },},]

模板語法

{{輸出值,變量或?qū)ο髮傩詝}

{%執(zhí)行代碼段%}

需求1

# 在網(wǎng)址中輸入127.0.0.1/grades時,將所有班級顯示出來# 在網(wǎng)址中輸入127.0.0.1/students時,將所有學(xué)生顯示出來- 先創(chuàng)建一個模板(project/templates/appname/)? ? grades.html? ? students.html- 模板代碼(基本頁面顯示)- 創(chuàng)建對應(yīng)視圖

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

# 班級頁

from.modelsimportGradesdefgrades(request):

# 通過模型取出數(shù)據(jù)庫中對應(yīng)表單數(shù)據(jù)

gradeList = Grades.objects.all()

# 將數(shù)據(jù)傳遞給模板(模板將數(shù)據(jù)渲染上之后再返回)

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

需求2

# 在班級信息中點擊時,顯示對應(yīng)班級信息- 每個班級點擊時,URL都會有變化?

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

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

# 班級對應(yīng)學(xué)生頁- 視圖中的具體操作

# 對應(yīng)班級的學(xué)生信息

def gradeStudents(request,gradeid):

# 獲取對應(yīng)班級對象

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

# 對應(yīng)班級的學(xué)生studentList = grade.students_set.all()

# 都是學(xué)生信息都是一樣顯示(即模板是一致的)

# 就是數(shù)據(jù)源不一樣

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

鏈接:http://www.itdecent.cn/p/d3b87efb555d

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容