一、Django簡(jiǎn)介
Django是用Python開發(fā)的一個(gè)免費(fèi)開源的Web框架,可以用于快速搭建高性能,優(yōu)雅的網(wǎng)站!
初次發(fā)布于2005年7月,并于2008年發(fā)布了第一個(gè)正式版本1.0。
二、Django特點(diǎn)
強(qiáng)大的數(shù)據(jù)庫(kù)功能: 擁有強(qiáng)大的數(shù)據(jù)庫(kù)操作接口(QuerySet API),如需要也能執(zhí)行原生SQL。
自帶強(qiáng)大的后臺(tái): 幾行簡(jiǎn)單的代碼就讓你的網(wǎng)站擁有一個(gè)強(qiáng)大的后臺(tái),輕松管理內(nèi)容!
優(yōu)雅的網(wǎng)址: 用正則匹配網(wǎng)址,傳遞到對(duì)應(yīng)函數(shù),隨意定義,如你所想!
模板系統(tǒng): 強(qiáng)大,易擴(kuò)展的模板系統(tǒng),設(shè)計(jì)簡(jiǎn)易,代碼,樣式分開設(shè)計(jì),更容易管理。
(注:前后端分離時(shí),也可以用Django開發(fā)API,完全不用模板系統(tǒng)。)
緩存系統(tǒng),與Memcached, Redis等緩存系統(tǒng)聯(lián)用,更出色的表現(xiàn),更快的加載速度。
國(guó)際化,完全支持多語(yǔ)言應(yīng)用,允許你定義翻譯的字符,輕松翻譯成不同國(guó)家的語(yǔ)言。
三、MVC模式
MVC是一種軟件設(shè)計(jì)典范,用一種業(yè)務(wù)邏輯、數(shù)據(jù)、界面顯示分離的方法組織代碼,將業(yè)務(wù)邏輯聚集到一個(gè)部件中,在改進(jìn)和個(gè)性化定制界面及用戶交互的同時(shí),不需要重新編寫業(yè)務(wù)邏輯。MVC被獨(dú)特的發(fā)展起來(lái)用于映射傳統(tǒng)的輸入、處理和輸出功能在一個(gè)邏輯的圖形化用戶界面的結(jié)構(gòu)中。
MVC
- Model(模型)
? ? 應(yīng)用程序中用于處理應(yīng)用程序數(shù)據(jù)邏輯部分;
? ? 通常模型對(duì)象負(fù)責(zé)在數(shù)據(jù)庫(kù)中存取數(shù)據(jù);
- View(視圖)
? ? 應(yīng)用程序中處理數(shù)據(jù)顯示部分;
? ? 通常視圖是依據(jù)模型數(shù)據(jù)創(chuàng)建的;
- Controller(控制器)
? ? 應(yīng)用程序中處理用戶交互部分;
? ? 通常控制器負(fù)責(zé)從視圖中讀取數(shù)據(jù),控制用戶輸入,并向模型發(fā)送數(shù)據(jù);
優(yōu)點(diǎn): 降低各個(gè)功能模塊之間的耦合性,方便變更,更容易重構(gòu)代碼,最大程度上實(shí)現(xiàn)代碼的重用。
四、MTV模式
本質(zhì)上MTV與MVC模式?jīng)]有什么區(qū)別,也是各組件之間為了保持松耦合關(guān)系,只是定義上有些不同。
MTV
- View(視圖)
? ? 負(fù)責(zé)業(yè)務(wù)邏輯,并在適當(dāng)?shù)臅r(shí)候調(diào)用Model和Template
Django還有一個(gè)url分發(fā)器,它的作用是將一個(gè)個(gè)URL的頁(yè)面請(qǐng)求分發(fā)給不同的view處理,view再調(diào)用相應(yīng)的Model和Template。
五、Django環(huán)境搭建
Django版本選擇
pip安裝(如果有直接跳過(guò))
- 下載get-pip.py文件(Linux, Mac OSX, Windows都可用)https://bootstrap.pypa.io/get-pip.py- 安裝(在終端中運(yùn)行)? ? $ python get-pip.py備注:? ? 當(dāng)Python2.x和Python3.x共存的時(shí)候要區(qū)分是哪個(gè)版本需要安裝;
pip更新(Linux或MacOS): pip install -U pip
pip更新(Windows): python -m pip install -U pip
安裝Django
- 安裝? ? $ pip install Django==1.11.4- 驗(yàn)證是否成功()? ?
進(jìn)入到python環(huán)境(終端中輸入python)
>>> import django
>>> django.get_version()'1.11.4'
六、Django項(xiàng)目創(chuàng)建
新建Django項(xiàng)目:? ?
$ django-admin startproject projectName目錄層級(jí)說(shuō)明:? ?
manage.py 一個(gè)命令行工具,可以使我們多種方式對(duì)Django項(xiàng)目進(jìn)行交互? ? projectName/__init__.py 一個(gè)空文件,告訴python這個(gè)目錄被看做一個(gè)python包(有這個(gè)能稱之為包)? ?
projectName/settings.py 項(xiàng)目的配置文件? ?
projectName/urls.py? 項(xiàng)目URL聲明? ?
projectName/wsgi.py? ? 項(xiàng)目與WSGI兼容的Web服務(wù)器入口
備注: Linux或Mac下,直接在終端中操作;而在Windows中在cmd中操作(開始 -> 搜索cmd)
七、設(shè)計(jì)表結(jié)構(gòu)
班級(jí)表
表名: grades字段: 序號(hào)id、班級(jí)名gname、開班時(shí)間gdate、男生數(shù)量gboynum、女生數(shù)量ggirlnum、是否刪除isdel
學(xué)生表
表名: students字段: 序號(hào)id、學(xué)生名sname、性別ssex、年齡sage、班級(jí)sclass、簡(jiǎn)介sbrief、是否刪除isdel
八、配置數(shù)據(jù)庫(kù)
在__init__中添加兩行代碼 (確保安裝mysql,另外需要pip3 install pymysql)
importpymysqlpymysql.install_as_MySQLdb()
python3安裝的是PxMysql (和python2是不一樣的)
在settings.py中修改默認(rèn)數(shù)據(jù)庫(kù)
DATABASES = {'default': {
# 修改為
mysql'ENGINE':'django.db.backends.mysql',
# 必須先創(chuàng)建有對(duì)應(yīng)的數(shù)據(jù)庫(kù)
'NAME':'zyz',
# 用戶名
'USER':'root',
# 密碼
'PASSWORD':'123456’,
? ? ? ? # 主機(jī)
? ? ? ? 'HOST': '127.0.0.1',
? ? ? ? # 端口號(hào)
? ? ? ? 'POST': '3306’? ? }}
Django默認(rèn)使用SQLine數(shù)據(jù)庫(kù)
九、創(chuàng)建應(yīng)用
要先進(jìn)入項(xiàng)目目錄下,cd projectName然后執(zhí)行下面的命令:
$ python3 manage.py startapp appName
項(xiàng)目文件說(shuō)明:
? ? admin.py 站點(diǎn)配置
? ? models.py 模型
? ? views.py 視圖
其實(shí)一個(gè)項(xiàng)目中可以創(chuàng)建多個(gè)應(yīng)用;
十、激活應(yīng)用
在settings.py文件中,將appName應(yīng)用加入到INSTALL_APPS選項(xiàng)中.
INSTALLED_APPS = ['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'appName'# 添加自己的應(yīng)用]
十一、定義模型
班級(jí)表
# 班級(jí)表
GradesclassGrades(models.Model)
:# 對(duì)應(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()
# 在沒(méi)有添加主鍵時(shí),它會(huì)在生成時(shí)自動(dòng)添加主鍵
# 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é)生都會(huì)有一個(gè)班級(jí))
sclass = models.ForeignKey('Grades')
十二、數(shù)據(jù)庫(kù)中生成對(duì)應(yīng)表單
生成遷移文件
$ python3 manage.py makemigrations
備注: 在migrations目錄中生成一個(gè)遷移文件,此時(shí)數(shù)據(jù)庫(kù)中還沒(méi)生成表單
執(zhí)行遷移
$ python3 manage.py migrate
備注: 相當(dāng)于執(zhí)行了MySQL語(yǔ)句創(chuàng)建了表單(appname_students、appname_grades)
十三、測(cè)試數(shù)據(jù)庫(kù)表單操作
- 進(jìn)入到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()? ?
備注: 在模型類中,其實(shí)會(huì)有一個(gè)隱藏屬性objects-
添加數(shù)據(jù)(創(chuàng)建對(duì)象)
>>> grade = Grades()
>>> grade.gname ='python04'
>>> grade.gdate = datetime(year=2018,month=5,day=27)
>>> grade.gboynum =30>>> grade.ggirlnum =20
>>> grade.save()
# 只有執(zhí)行保存,才會(huì)往數(shù)據(jù)庫(kù)中插入數(shù)據(jù)備注: 添加數(shù)據(jù)本質(zhì),就是創(chuàng)建一個(gè)模型類的對(duì)象實(shí)例- 查看數(shù)據(jù)(查看對(duì)象)? ?
Grades.objects.get(pk=1)? ?
Grades.objects.get(pk=2)
- 修改數(shù)據(jù)(修改對(duì)象屬性)? ?
g = Grades.objects.get(pk=1)? ?
g.gboynum =70g.save()? ?
- 刪除數(shù)據(jù)? ?
g.delete()
# 物理刪除,即數(shù)據(jù)庫(kù)中表單數(shù)據(jù)被刪除
- 關(guān)聯(lián)對(duì)象
# 獲取到班級(jí)對(duì)象 (pk即是id那個(gè)字段)
>>> grade = Grades.objects.get(pk=2)
# 添加學(xué)生對(duì)象
>>> stu1 = Students()
>>> stu1.sname ='王大帥'
>>> stu1.ssex ='男'
>>> stu1.sage =18
>>> stu1.sbrief ='我住隔壁,我姓王,你有事情我?guī)兔?
>>> stu1.sclass = grade
# 這個(gè)即是關(guān)聯(lián)上對(duì)象,如果沒(méi)有管理,執(zhí)行save會(huì)報(bào)錯(cuò)
>>> stu.save()
>>> stu2 = Students()
>>> stu2.sname ='李花花'
>>> stu2.ssex ='女'
>>> stu2.sage =18
>>> stu2.sbrief ='你負(fù)責(zé)賺錢養(yǎng)家,我負(fù)責(zé)貌美如花.'
>>> stu2.sclass = grade
>>> stu2.save()? ?
- 獲取關(guān)聯(lián)對(duì)象? ? 語(yǔ)法:? ? ? ? 對(duì)象.關(guān)聯(lián)的類名小寫_set.all()??
例如:? ? ? ? ? grade.students_set.all()??
備注: 在班級(jí)中,想要獲取某個(gè)班級(jí)中關(guān)聯(lián)的學(xué)生信息? ? 需求: python04班級(jí)存在,? 如何快速關(guān)聯(lián)上快速創(chuàng)建對(duì)應(yīng)學(xué)生?
# 可以直接通過(guò)以下方法創(chuàng)建,并且不需要調(diào)用保存 (但班級(jí)是python04而不是python05)
# 其實(shí)就是直接grade和創(chuàng)建的學(xué)生對(duì)象關(guān)聯(lián)起來(lái)了
stu3 = grade.students_set.create(sname='王八',ssex='男',sage=20,sbrief='哈哈,咬我啊..')
十四、啟動(dòng)服務(wù)器
語(yǔ)法:python3manage.pyrunserverip:port
例如:python3manage.pyrunserver
備注:IP可以不寫,代表即是本機(jī)IP端口號(hào)默認(rèn)是8000? ?
啟動(dòng)成功后,在瀏覽器可以看到”Itworked!”
說(shuō)明:? ? 這是一個(gè)純python寫的輕量級(jí)web服務(wù)器,僅僅在開發(fā)測(cè)試階段中使用
十五、Admin站點(diǎn)管理(后臺(tái)可視化界面操作)
概述
內(nèi)容發(fā)布: 負(fù)責(zé)添加、修改、刪除內(nèi)容
公告訪問(wèn)
配置Admin應(yīng)用
在`settings.py`文件中的IINSTALLED_APPS中添加'django.contrib.admin'(默認(rèn)是已經(jīng)是添加好的)
創(chuàng)建管理員用戶
$ python3 manage.py createsuperuser
訪問(wèn)站點(diǎn)管理
語(yǔ)法: ip:端口號(hào)/admin
例如: 192.168.0.13:8000/admin
站點(diǎn)管理的漢化版
在settings.py中替換以下內(nèi)容即可? ? LANGUAGE_CODE ='en-us'替換 LANGUAGE_CODE ='zh-Hans'TIME_ZONE ='UTC'替換 TIME_ZONE ='Asia/Shanghai'
管理數(shù)據(jù)表(后臺(tái)界面中)
修改admin.py文件:??
# 引入
from.modelsimportGrades,Students
# 注冊(cè)
admin.site.register(Grades)admin.site.register(Students)
自定義管理數(shù)據(jù)頁(yè)面(因?yàn)樵卷?yè)面顯示不夠友好)
# 自定義管理數(shù)據(jù)頁(yè)面
# 該類需要注冊(cè)時(shí)添加進(jìn)去
classGradesAmin(admin.ModelAdmin):
# 列表頁(yè)的屬性
# 顯示字段(需要顯示什么字段,就寫上什么字段即可)
list_display = ['pk','gname','gdate','gboynum','ggirlnum','isdel']
# 過(guò)濾器(過(guò)濾字段)
list_filter = ['gname']
# 搜索字段
search_fields = ['pk']# 分頁(yè)(多少條為一頁(yè))list_per_page =5
# 添加、修改頁(yè)屬性# 屬性的先后順序
fields = ['gboynum','gname','gdate','ggirlnum','isdel']
# 給屬性分組(fields和fieldsets不能同時(shí)使用)
fieldsets = [? ? ? ? ? ? ??
('num',{'fields':['gboynum','ggirlnum']}),? ? ? ? ? ? ? ?
('base',{'fields':['gname','gdate','isdel']}),? ?
]
# 注冊(cè)(以后其實(shí)不會(huì)在這里完成注冊(cè),會(huì)通過(guò)裝飾器完成注冊(cè)!)
admin.site.register(Grades,GradesAmin)
自定義管理頁(yè)面(關(guān)聯(lián)對(duì)象)
需求: 在創(chuàng)建班級(jí)時(shí),可以直接添加幾個(gè)學(xué)生
# TabularInline 或 StackedInline 兩種顯示方式
classStudentsInfo(admin.TabularInline):
# 要?jiǎng)?chuàng)建學(xué)生
model = Students
# 需要?jiǎng)?chuàng)建幾個(gè)
extra =1
# 與Grades關(guān)聯(lián)上
classGradesAmin(admin.ModelAdmin):
# 與上面關(guān)聯(lián)上inlines = [StudentsInfo]
自定義管理頁(yè)面(布爾類型的顯示問(wèn)題)
classStudentsAdmin(admin.ModelAdmin):
defisdel(self):ifself.isdel ==False:return"刪除"
# 設(shè)置頁(yè)面列的名稱
isdel.short_description ='是否刪除'
自定義管理頁(yè)面(執(zhí)行動(dòng)作的位置)
# 將動(dòng)作位置放置底部
classStudentsAdmin(admin.ModelAdmin):
# 執(zhí)行動(dòng)作的位置
actions_on_bottom =Trueactions_on_top =False
十六、使用裝飾器完成注冊(cè)
# 自定義管理數(shù)據(jù)頁(yè)面@admin.register(Students)classStudentsAdmin(admin.ModelAdmin):
十七、視圖基本使用
概述
在Django中,視圖對(duì)web請(qǐng)求進(jìn)行回應(yīng);視圖其實(shí)就是一個(gè)python函數(shù),在views.py文件中定義;
備注: 有幾個(gè)頁(yè)面就有幾個(gè)視圖
定義視圖
fromd? jango.http?? import?? HttpResponse
# 沒(méi)有使用任何的模板
def? index(request):
return??? HttpResponse('hello zyz!!!')
配置url (簡(jiǎn)單)
# 修改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')),# 會(huì)定位到myapp.urls中]
# 在對(duì)應(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中的首頁(yè)]
配置url (帶參數(shù))
# 描述(在views.py中定義的視圖)
def?? detail(request,num):
return?? HttpResponse('detail-%s'% num)
# 在appname/urls.py中配置即可? ?
urlpatterns = [? ? url(r'^$', views.index),
# 添加括號(hào),其實(shí)就是正則表達(dá)式中的組的概念。
# 而匹配到的就是可以給到
detail(request,num)函數(shù)中的
numurl(r'^(\d+)/$', views.detail)]
十八、模板的基本使用
概念
模板是HTML頁(yè)面,可以根據(jù)視圖中傳遞過(guò)來(lái)的數(shù)據(jù)進(jìn)行填充
創(chuàng)建模板目錄
在project中創(chuàng)建模板目錄templates;
在templares目錄中,創(chuàng)建對(duì)應(yīng)應(yīng)用目錄appname作為項(xiàng)目模板目錄;
創(chuàng)建對(duì)應(yīng)應(yīng)用app的目錄,因?yàn)橐粋€(gè)項(xiàng)目可以創(chuàng)建多個(gè)app,這也方便對(duì)應(yīng)
配置模板路徑
# 修改settings.py文件中的TEMPLATES;
TEMPLATES = [{'BACKEND':'django.template.backends.django.DjangoTemplates',
# 添加模板目錄# 開頭部分都有定義BASE_DIR,即項(xiàng)目其實(shí)目錄'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',? ? ? ? ],? ? },},]
模板語(yǔ)法
{{輸出值,變量或?qū)ο髮傩詝}
{%執(zhí)行代碼段%}
需求1
# 在網(wǎng)址中輸入127.0.0.1/grades時(shí),將所有班級(jí)顯示出來(lái)# 在網(wǎng)址中輸入127.0.0.1/students時(shí),將所有學(xué)生顯示出來(lái)- 先創(chuàng)建一個(gè)模板(project/templates/appname/)? ? grades.html? ? students.html- 模板代碼(基本頁(yè)面顯示)- 創(chuàng)建對(duì)應(yīng)視圖
# 班級(jí)頁(yè)defgrades(request):pass- url控制器(在myapp/urls.py中分發(fā))? ? url(r'^grades/$', views.grades),- 視圖中的具體操作
# 班級(jí)頁(yè)
from.modelsimportGradesdefgrades(request):
# 通過(guò)模型取出數(shù)據(jù)庫(kù)中對(duì)應(yīng)表單數(shù)據(jù)
gradeList = Grades.objects.all()
# 將數(shù)據(jù)傳遞給模板(模板將數(shù)據(jù)渲染上之后再返回)
returnrender(request,'myapp/grades.html',{'grades': gradeList})
需求2
# 在班級(jí)信息中點(diǎn)擊時(shí),顯示對(duì)應(yīng)班級(jí)信息- 每個(gè)班級(jí)點(diǎn)擊時(shí),URL都會(huì)有變化?
? {{grade.gname}}- 匹配不同的視圖??
url(r'^grades/(\d+)$', views.gradeStudents),
# 班級(jí)對(duì)應(yīng)學(xué)生頁(yè)- 視圖中的具體操作
# 對(duì)應(yīng)班級(jí)的學(xué)生信息
def gradeStudents(request,gradeid):
# 獲取對(duì)應(yīng)班級(jí)對(duì)象
grade = Grades.objects.get(pk=gradeid)
# 對(duì)應(yīng)班級(jí)的學(xué)生studentList = grade.students_set.all()
# 都是學(xué)生信息都是一樣顯示(即模板是一致的)
# 就是數(shù)據(jù)源不一樣
returnrender(request,'myapp/students.html',{'students':studentList})
鏈接:http://www.lxweimin.com/p/d3b87efb555d