Django-C001-快速入门
此文章完成度【100%】留著以后忘記的回顧。多寫多練多思考,我會努力寫出有意思的demo,如果知識點(diǎn)有錯誤、誤導(dǎo),歡迎大家在評論處寫下你的感想或者糾錯。
?
Django
Django是一個開放源碼的Web應(yīng)用框架,由Python寫成,采用MVT的框架模式,它最初是被開發(fā)用于管理勞倫斯出版社集團(tuán)旗下的一些以新聞內(nèi)容為主的網(wǎng)站,CMS(內(nèi)容管理系統(tǒng))軟件。并于2005年7月在BSD許可證下發(fā)布。這套框架是以比利時的吉普賽爵士吉他手Django?Reinhardt來命名的。
?
?
框架介紹
?
Django?項(xiàng)目是一個Python定制框架,它源自一個在線新聞Web站點(diǎn),于2005年以開源的形式被釋放出來,Django框架的核心組件有:
-
-
- 用于創(chuàng)建模型的對象關(guān)系映射(Object Relational Mapping,簡稱ORM)
- 為最終用戶設(shè)計的完美管理界面
- 一流的 URL 設(shè)計
- 設(shè)計者友好的模板語言
- 緩存系統(tǒng)
- 用于創(chuàng)建模型的對象關(guān)系映射(Object Relational Mapping,簡稱ORM)
-
Django使用?Python語言寫的開源Web開發(fā)框架 (open source web framework),它鼓勵快速開發(fā),并遵循MVC設(shè)計。Django遵守BSD版權(quán),
初次發(fā)布于2005年,并在2008年發(fā)布了第一個正式版本1.0
?
架構(gòu)設(shè)計
Django是一個基于MVC構(gòu)造的框架,但是在Django中,控制器接受用戶輸入的部分由框架自行處理,所以Django里更關(guān)注的是模型 (Model)、視圖(Views)、模板(Template),被稱為MVT模式。
| ?M? | 模型(Model),即數(shù)據(jù)存取層 | 處理與數(shù)據(jù)相關(guān)的所有事務(wù): 如何存取、如何驗(yàn)證有效性、包含哪些行為以及數(shù)據(jù)之間的關(guān)系等。 |
| ?V | 視圖 (View),即業(yè)務(wù)邏輯層 | 存取模型及調(diào)取恰當(dāng)模板的相關(guān)邏輯。模型與模板的橋梁 |
| ?T | 模板 (Template) 即表現(xiàn)層 | 處理與表現(xiàn)相關(guān)的決定,如何在頁面或其他類型文檔中進(jìn)行顯示 |
從以上表述可以看出 Django?視圖不處理用戶輸入,而僅僅決定要展現(xiàn)哪些數(shù)據(jù)給用戶,而 Django 模板僅僅決定如何展現(xiàn)Django?視圖指定的數(shù)據(jù),或者說,Django?將 MVC 中的視圖進(jìn)一步分解為 Django?視圖和?Django?模板兩個部分,分別決定展現(xiàn)哪些數(shù)據(jù)和如何展現(xiàn),使得Django的模板可以根據(jù)需要隨時替換,而不僅僅限制于內(nèi)置的模板
至于?MVC?控制器部分,由 Django?框架的 URLconf?機(jī)制是使用正則表達(dá)式匹配URL,然后調(diào)用適合的Python函數(shù),URLconf對于URL的規(guī)則沒有任何限制,你完全可以設(shè)計成任意的URL風(fēng)格,框架把控制層給封裝了,無非與數(shù)據(jù)交互這層都是數(shù)據(jù)庫表的增、刪、改、查的操作,在寫程序時候,只要調(diào)用相應(yīng)的方法就行了,感覺很方便,程序員把控制層?xùn)|西交給了Django自動完成,只需要編寫非常少的代碼就可以完成很多事情。
設(shè)計哲學(xué)
?
Django的主要目的是簡便、快速的開發(fā)數(shù)據(jù)庫驅(qū)動的網(wǎng)站。它強(qiáng)調(diào)代碼復(fù)用,多個組件可以很方便的以“插件”形式服務(wù)于整個框架,Django有許多功能強(qiáng)大的第三方插件,你甚至可以很方便的開發(fā)出自己的工具包。這使得Django具有很強(qiáng)的可擴(kuò)展性。它還強(qiáng)調(diào)快速開發(fā)和DRY(Do Not Repeat Yourself)原則。
Django基于MVC的設(shè)計十分優(yōu)美:
-
對象關(guān)系映射 (ORM object-relational mapping):以Python類形式定義你的數(shù)據(jù)模型,ORM將模型與關(guān)系數(shù)據(jù)庫連接起來,你將得到一個非常容易使用的數(shù)據(jù)庫API,同時你也可以在Django中使用原始的SQL語句。
-
URL 分派:使用正則匹配URL,你可以設(shè)計任意的URL,沒有框架的特定限定。像你喜歡的一樣靈活。
-
模版系統(tǒng):使用Django強(qiáng)大而可擴(kuò)展的模板語言,可以分隔設(shè)計、內(nèi)容和Python代碼。并且具有可繼承性。
-
表單處理:你可以方便的生成各種表單模型,實(shí)現(xiàn)表單的有效性檢驗(yàn)。可以方便的從你定義的模型實(shí)例生成相應(yīng)的表單。
-
Cache系統(tǒng):可以掛在內(nèi)存緩沖或其它的框架實(shí)現(xiàn)超級緩沖 -- 實(shí)現(xiàn)你所需要的粒度。
-
會話(session),用戶登錄與權(quán)限檢查,快速開發(fā)用戶會話功能。
-
國際化:內(nèi)置國際化系統(tǒng),方便開發(fā)出多種語言的網(wǎng)站。
-
自動化的管理界面:不需要你花大量的工作來創(chuàng)建人員管理和更新內(nèi)容。Django自帶一個ADMIN site
學(xué)習(xí)直達(dá)
?
?
Django官網(wǎng)? Django中文文檔? Django基礎(chǔ)教程? The Django Book? Django-redis中文文檔?
?項(xiàng)目創(chuàng)建
?
接下來你會得到兩種方式創(chuàng)建項(xiàng)目:
1.通過命令行進(jìn)入到你想創(chuàng)建項(xiàng)目的目錄下輸入
django-admin startproject test1[test1為你要創(chuàng)建的項(xiàng)目名]
2.創(chuàng)建應(yīng)用
python manage.py startapp?circle【circle是應(yīng)用名】
3.建立應(yīng)用和項(xiàng)目之間的關(guān)聯(lián),進(jìn)行應(yīng)用注冊,在settings.py中INSTALLED_APPS中添加應(yīng)用名
?運(yùn)行自己開發(fā)的第一個Web項(xiàng)目輸入命令?python?manage.py runserver,當(dāng)顯示下面圖片的信息說明運(yùn)行成功
?
?那么接下來就是第二種特別方便的方式-------->pycharm
a.首先點(diǎn)擊File-->New Project-->Django
?
點(diǎn)擊Create就將項(xiàng)目創(chuàng)建完成,非常的簡單方便,同樣你可以運(yùn)行這個項(xiàng)目測試一下是否創(chuàng)建的正確
?
?
模型設(shè)計
?
操作數(shù)據(jù)庫一般情況都是通過寫SQL語句,那么不用SQL語句也想操作數(shù)據(jù)庫需要用到什么呢?那么接下來出場的就是ORM框架
ORM框架
O就是object-對象,R是relation-關(guān)系,M是mapping-映射。在ORM框架中,我們通過類和數(shù)據(jù)表進(jìn)行了一個映射,可以讓我們通過類和類對象就能操作所對應(yīng)的數(shù)據(jù)表中的數(shù)據(jù)。ORM的作用:根據(jù)設(shè)計的類生成數(shù)據(jù)庫的表
使用Django進(jìn)行數(shù)據(jù)庫開發(fā)的步驟:
1.在models.py中定義模型類
2.遷移
3.通過類和對象完成數(shù)據(jù)的增、刪、改、查操作
1.定義模型類
模型類定義在models.py文件中,繼承自models.Model類
學(xué)生模型類已經(jīng)定義完成了。接下來就需要第二個步驟生成遷移文件
在命令中輸入?python manage.py makemigrations
?打開遷移文件如下圖:
?
接下來我們需要執(zhí)行遷移命令:
python manage.py migrate
?
當(dāng)執(zhí)行遷移命令后,Django框架會讀取遷移文件自動幫我們在數(shù)據(jù)庫中生成對應(yīng)的表格。
?
Django默認(rèn)采用sqlite3數(shù)據(jù)庫,上圖中的db.sqlite3就是Django框架幫我們自動生成的數(shù)據(jù)庫文件。 sqlite3是一個很小的數(shù)據(jù)庫,通常用在手機(jī)中,它跟mysql一樣,我們也可以通過sql語句來操作它。稍后我會將數(shù)據(jù)展示到頁面給大家看一下數(shù)據(jù)的情況,或者可以下載sqlite3數(shù)據(jù)庫有關(guān)的軟件查看
完善下面我們重新復(fù)習(xí)一下上面的步驟刪除所建的項(xiàng)目重頭還是做一次然后再完善下學(xué)生和學(xué)校這兩個類供我們之后的學(xué)習(xí)使用
1 class ClassInfo(models.Model): 2 """班級信息模型類""" 3 class_name = models.CharField(max_length=20) 4 class_num = models.IntegerField() 5 6 7 class StudentInfo(models.Model): 8 """學(xué)生信息模型類""" 9 name = models.CharField(max_length=20) 10 age = models.IntegerField() 11 gender = models.BooleanField(default=False) 12 stu_class = models.ForeignKey(ClassInfo,on_delete=models.CASCADE) models?
這里簡單的提一下引用外鍵的一些說明,在2.0以前on_delete=models.CASCADE為默認(rèn)值,可以省略。但是如果你使用的是2.x就必須完整的寫入,on_delete還有一些默認(rèn)的選項(xiàng),會在以后單獨(dú)討論外鍵的時候詳細(xì)說明。
ForeignKey(ClassInfo,on_delete=models.CASCADE)接下來我們通過模型類操作數(shù)據(jù)庫
這里我們可以通過shell模式進(jìn)行簡單的添加一些數(shù)據(jù)
進(jìn)入shell?在命令行中輸入:python?manage.py shell
1 # 首先引入test1.models下的類 2 from test1.models import ClassInfo, StudentInfo 3 """ 4 這里提醒一下test1為你的應(yīng)用名不是項(xiàng)目名稱 5 如果在導(dǎo)包的時候發(fā)現(xiàn)報錯,首先查看一下導(dǎo)入的包名或者類名 6 是否正確。如果都正確,就是有肯能就是你在進(jìn)入shell之后才編 7 寫的類,這時候退出shell模式,在從新進(jìn)入一次就可以了 8 """接下來查詢一下ClassInfo、StudentInfo中的信息看看會如何顯示
ClassInfo.objects.all() # 目標(biāo)結(jié)果會返回一個<QuerySet []>因?yàn)檫@里還沒有寫入任何數(shù)據(jù)接下來就是通過Python 的shell中插入一條數(shù)據(jù)
1 c = ClassInfo() # 創(chuàng)建一個ClassInfo對象 2 c.class_name = '高三·三班' # 設(shè)置名字 3 c.class_num = 66 # 設(shè)置班級人數(shù) 4 c.save() # 調(diào)用save()方法 5 # 在查詢一下ClassInfo里的數(shù)據(jù) 6 ClassInfo.objects.all() # 目標(biāo)結(jié)果為<QuerySet [<ClassInfo: ClassInfo object (1)>]>數(shù)據(jù)已經(jīng)插入了,接下來查詢一下id=1的對象數(shù)據(jù)
1 c = ClassInfo.objects.get(id=1) 2 c # <ClassInfo: ClassInfo object (1)> 3 c.id # 1 4 c.class_name # 高二·三班 5 c.class_num # 66 6 # 我們也可以通過c這個對象修改這條數(shù)據(jù)里面的信息 7 c.class_num = 54 8 c.save() 9 c.class_num # 這里就會返回修改后的數(shù)據(jù)54創(chuàng)建一個關(guān)聯(lián)ClassInfo的StudentInfo的數(shù)據(jù)
# 創(chuàng)建一個StudentInfo類的對象 s = StudentInfo() s.name = '李雷' s.age = 16 s.stu_class = c s.save() # 班級與學(xué)生是一對多的關(guān)系,django中提供了關(guān)聯(lián)的操作方式 # 獲得關(guān)聯(lián)集合:返回當(dāng)前班級對象的所有學(xué)生 c.studentinfo_set.all() # <QuerySet [<StudentInfo: StudentInfo object (1)>]>現(xiàn)在這種情況下想查看一下數(shù)據(jù),真的是很不方便,如果在沒有相關(guān)數(shù)據(jù)庫軟件的時候,就只能在Shell中查看嗎?這里Django還提供了一個后臺管理之類的東西,我們將數(shù)據(jù)顯示在哪里試一下
?
后臺管理
?
使用Django的管理模塊,需要按照如下步驟操作:
1.管理界面本地化:本地化是將顯示的語言、時間等使用本地的習(xí)慣,這里的本地化就是進(jìn)行中國化,中國大陸地區(qū)使用簡體中文,時區(qū)使用亞洲/上海時區(qū),注意這里不使用北京時區(qū)表示。
打開untitled/settings.py文件,找到語言編碼、時區(qū)的設(shè)置項(xiàng),將內(nèi)容改為如下:
LANGUAGE_CODE = 'zh-hans' # 設(shè)置中文 TIME_ZONE = 'Asia/Shanghai' # 設(shè)置時區(qū)2.創(chuàng)建管理員?
# 創(chuàng)建命令 python manage.py createsuperuser # 接下來就是設(shè)置用戶名、郵箱、密碼 # 啟動服務(wù)器 python manage.py runserver # 然后可以打開瀏覽器查看是否成功 # 127.0.0.1:8000/admin/3.注冊模型類:登錄后臺管理,默認(rèn)沒有我們創(chuàng)建的應(yīng)用定義的模型類,而需要在自己應(yīng)用中的admin.py文件中注冊,才可以在后臺管理中看到,并進(jìn)行增、刪、改、查
打開test1/admin.py文件
1 from django.contrib import admin 2 from test1.models import ClassInfo, StudentInfo 3 4 5 # Register your models here. 6 admin.site.register(ClassInfo) 7 admin.site.register(StudentInfo)在瀏覽器刷新頁面就可以看見自己test1這個應(yīng)用被添加進(jìn)來
4.自定義管理頁面:在列表頁只顯示出了ClassInfo object,對象的其它屬性并沒有列出來,查看非常不方便。 Django提供了自定義管理頁面的功能,比如列表頁要顯示哪些值。
打開test1/admin.py文件
from django.contrib import admin from test1.models import ClassInfo, StudentInfo# 自定義類 class ClassInfoAdmin(admin.ModelAdmin):list_display = ['id', 'class_name', 'class_num']class StudentInfoAdmin(admin.ModelAdmin):list_display = ['id', 'name', 'age', 'gender', 'stu_class']# Register your models here. admin.site.register(ClassInfo, ClassInfoAdmin) admin.site.register(StudentInfo, StudentInfoAdmin)?刷新頁面,數(shù)據(jù)就會顯示出來了
視圖
Django給我提供的管理頁面,我們沒有寫,如果配置頁面的規(guī)則,但是瀏覽器就能找到,這是因?yàn)镈jango默認(rèn)給我們陪著了這個頁面的信息,那么接下來我們就來了解一下定義視圖,配置URLconf,對于Django的設(shè)計框架MVT,用戶在URL中請求的視圖,視圖接受請求后進(jìn)行處理,并將處理的結(jié)果返回給請求者
使用視圖時需要進(jìn)行兩部操作:
1.定義視圖函數(shù)
2,配置URLconf
1.定義視圖:視圖就是一個Python函數(shù),被定義在views.py中,視圖有一個必要的參數(shù),request,視圖必須返回HTTPResponse對象,HTTPResponse中的參數(shù)內(nèi)容會顯示在瀏覽器的頁面上
打開test1/views.py,定義視圖:
from django.http import HttpResponse# Create your views here. def index(request):return HttpResponse('測試')2.配置URLconf
查找視圖的過程:請求者在瀏覽器中輸入地址,請求到網(wǎng)站后,獲取url信息,然后與URLconf進(jìn)行匹配,如果匹配成功則調(diào)用對應(yīng)的視圖函數(shù),如果失敗返回404
URLconf包括url規(guī)則、視圖兩部分
- url規(guī)則使用正則表達(dá)式
- 視圖就是views.py中定義的函數(shù)
完成URLconf配置
- 在應(yīng)用中定義URLconf(這里你可以直接復(fù)制項(xiàng)目中原有的urls.py到自己的應(yīng)用中)
- 在項(xiàng)目中也添加一個URLconf
接下來就在瀏覽器中測試一下
?
?模板
想讓你的頁面精美嗎?那么模板就起到作用了,想讓你的頁面酷炫嗎?那么模板就起作用了,想讓你的頁面上天嗎?那么模板就起作用了
在Django中將前端的內(nèi)容定義在模板中,然后再把模板交給視圖調(diào)用。就可以完成以上的操作。
創(chuàng)建模板
那么問題來了,每個模塊都有自己的歸屬,模板的歸屬在哪里,如果你是用Pycharm生成的項(xiàng)目,你就會發(fā)現(xiàn)有一個空文件夾一直未使用,他的名字就叫?templates
這里我會在templates里創(chuàng)建一個和應(yīng)用名一樣的文件夾,來存儲這個應(yīng)用所使用的頁面,那么就讓我們動手來創(chuàng)建吧
?這樣就算完成了嗎?并沒有,現(xiàn)在你就需要讓去配制一下它的路徑,讓我們的程序要到它
首先打開test4/settings.py文件,設(shè)置TEMPLATES的DIRS值
?
DIRS': [os.path.join(BASE_DIR, 'templates')],?定義模板
在你剛剛創(chuàng)建的index.html開始書寫你的網(wǎng)頁
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>index模板</title> 6 </head> 7 <body> 8 <h1>{{ class_name }}</h1> 9 <ul> 10 {% for class_name in class_list %} 11 <li>{{ class_name }}</li> 12 {% endfor %} 13 </ul> 14 </body> 15 </html>?
這里一定會發(fā)現(xiàn)一堆亂七八糟的東西,出現(xiàn)在你的視線里。
<!--在模板中輸出變量,變量可能是從視圖中傳遞過來的,也可能是在模板中定義的--> {{變量名}} <!--下面就是模板使用代碼段的方式--> {%代碼段%}既然視圖中可以傳值過來,那么怎么傳?暫時先不告訴你明白下面的內(nèi)容,你自然就會懂得
視圖調(diào)用模板
調(diào)用模板的三個步驟:
這里就來找到視圖views.py這個文件調(diào)用上面定義的模板文件
from django.http import HttpResponse from django.template import loader# /index def index(request):# 1.獲取模板template = loader.get_template('class_system/index.html')# 2.定義上下文context = {'class_name': '二年三班', 'class_list': ['二年一班', '二年二班']}# 3.渲染模板return HttpResponse(template.render(context))刷新你的瀏覽器,會給你一個驚喜
那么每次都需要寫的那么煩嗎?你學(xué)的可是Python,那么當(dāng)然并不用
視圖調(diào)用模板要執(zhí)行以上三部分,于是Django提供了一個函數(shù)render封裝了以上代碼,方法render包含3個參數(shù)
1 """ 2 from django.http import HttpResponse 3 from django.template import loader 4 5 6 # /index 7 def index(request): 8 # 1.獲取模板 9 template = loader.get_template('class_system/index.html') 10 # 2.定義上下文 11 context = {'class_name': '班級', 'class_list': ['二年一班', '二年二班', '二年三班']} 12 # 3.渲染模板 13 return HttpResponse(template.render(context)) 14 """ 15 from django.shortcuts import render 16 17 18 def index(request): 19 context = {'class_name': '驚喜班級', 'class_list': ['二年一班', '二年二班', '二年三班']} 20 return render(request, 'class_system/index.html', context)
刷新頁面有驚喜
下面通過數(shù)據(jù)庫我們來鞏固一下上面啰嗦的一堆
在開始寫代碼之前,考慮一下我都需要什么
定義視圖
修改views.py
""" from django.http import HttpResponse from django.template import loader# /index def index(request):# 1.獲取模板template = loader.get_template('class_system/index.html')# 2.定義上下文context = {'class_name': '班級', 'class_list': ['二年一班', '二年二班', '二年三班']}# 3.渲染模板return HttpResponse(template.render(context)) """ from django.shortcuts import render from class_system.models import ClassInfodef index(request):"""顯示班級"""class_list = ClassInfo.objects.all()context = {'class_name': '我們的青春', 'class_list': class_list}return render(request, 'class_system/index.html', context)def detail(request, cid):"""顯示學(xué)生詳情"""c = ClassInfo.objects.get(id=cid)student_list = c.studentinfo_set.all()return render(request, 'class_system/detail.html', {'c': c, 'student_list': student_list})定義URLconf
from django.conf.urls import url from class_system import viewsurlpatterns = [url(r'index$', views.index),# \d+ 表示多個數(shù)字 也就是匹配index頁面<a href="/{{ c.id }}">返回的頁面地址# ()用于分組,將值傳遞給views里detail中的cid接收url(r'(\d+)$', views.detail), ]?
定義模板
修改templates/class_system/index.html
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>index模板</title> </head> <body> <h1>{{ class_name }}</h1> <ul>{% for c in class_list %}<li><a href="/{{ c.id }}">{{ c.class_name}}</a></li>{% endfor %} </ul> </body> </html>添加一個templates/class_system/detail.html
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> <h1>{{ c.class_name }}</h1> <ul>{% for student in student_list %}<li>{{ student.name }}:{{ student.age }}:{% if not student.gender == False %}女{% else %}男 {% endif %}</li>{% endfor %}</ul> </body> </html>?-The End-
轉(zhuǎn)載于:https://www.cnblogs.com/Hannibal-2018/p/11048298.html
總結(jié)
以上是生活随笔為你收集整理的Django-C001-快速入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js实现右键单击打开自定义的菜单
- 下一篇: 数据表操作