Django使用 Python語言寫的開源Web開發框架 (open source web framework),它鼓勵快速開發,並遵循MVC設計。Django遵照BSD版權,
html
初次發佈於2005年,並在2008年發佈了第一個正式版本1.0前端
M | 模型(Model),即數據存取層 | 處理與數據相關的全部事務: 如何存取、如何驗證有效性、包含哪些行爲以及數據之間的關係等。 |
V | 視圖 (View),即業務邏輯層 | 存取模型及調取恰當模板的相關邏輯。模型與模板的橋樑 |
T | 模板 (Template)python 即表現層mysql |
處理與表現相關的決定,如何在頁面或其餘類型文檔中進行顯示 |
對象關係映射 (ORM object-relational mapping):以Python類形式定義你的數據模型,ORM將模型與關係數據庫鏈接起來,你將獲得一個很是容易使用的數據庫API,同時你也能夠在Django中使用原始的SQL語句。程序員
URL 分派:使用正則匹配URL,你能夠設計任意的URL,沒有框架的特定限定。像你喜歡的同樣靈活。web
模版系統:使用Django強大而可擴展的模板語言,能夠分隔設計、內容和Python代碼。而且具備可繼承性。正則表達式
表單處理:你能夠方便的生成各類表單模型,實現表單的有效性檢驗。能夠方便的從你定義的模型實例生成相應的表單。redis
Cache系統:能夠掛在內存緩衝或其它的框架實現超級緩衝 -- 實現你所須要的粒度。sql
會話(session),用戶登陸與權限檢查,快速開發用戶會話功能。shell
國際化:內置國際化系統,方便開發出多種語言的網站。
自動化的管理界面:不須要你花大量的工做來建立人員管理和更新內容。Django自帶一個ADMIN site
Django官網 Django中文文檔 Django基礎教程 The Django Book Django-redis中文文檔
django-admin startproject test1[test1爲你要建立的項目名]
python manage.py startapp circle【circle是應用名】
O就是object-對象,R是relation-關係,M是mapping-映射。在ORM框架中,咱們經過類和數據表進行了一個映射,可讓咱們經過類和類對象就能操做所對應的數據表中的數據。ORM的做用:根據設計的類生成數據庫的表
使用Django進行數據庫開發的步驟:
1.在models.py中定義模型類
2.遷移
3.經過類和對象完成數據的增、刪、改、查操做
模型類定義在models.py文件中,繼承自models.Model類
學生模型類已經定義完成了。接下來就須要第二個步驟生成遷移文件
在命令中輸入 python manage.py makemigrations
打開遷移文件以下圖:
接下來咱們須要執行遷移命令:
python manage.py migrate
當執行遷移命令後,Django框架會讀取遷移文件自動幫咱們在數據庫中生成對應的表格。
Django默認採用sqlite3數據庫,上圖中的db.sqlite3就是Django框架幫咱們自動生成的數據庫文件。 sqlite3是一個很小的數據庫,一般用在手機中,它跟mysql同樣,咱們也能夠經過sql語句來操做它。稍後我會將數據展現到頁面給你們看一下數據的狀況,或者能夠下載sqlite3數據庫有關的軟件查看
完善下面咱們從新複習一下上面的步驟刪除所建的項目重頭仍是作一次而後再完善下學生和學校這兩個類供咱們以後的學習使用
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 """學生信息模型類""" 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)
ForeignKey(ClassInfo,on_delete=models.CASCADE)
這裏咱們能夠經過shell模式進行簡單的添加一些數據
進入shell 在命令行中輸入:python manage.py shell
1 # 首先引入test1.models下的類 2 from test1.models import ClassInfo, StudentInfo 3 """ 4 這裏提醒一下test1爲你的應用名不是項目名稱 5 若是在導包的時候發現報錯,首先查看一下導入的包名或者類名 6 是否正確。若是都正確,就是有肯能就是你在進入shell以後才編 7 寫的類,這時候退出shell模式,在重新進入一次就能夠了 8 """
接下來查詢一下ClassInfo、StudentInfo中的信息看看會如何顯示
ClassInfo.objects.all() # 目標結果會返回一個<QuerySet []>由於這裏尚未寫入任何數據
接下來就是經過Python 的shell中插入一條數據
1 c = ClassInfo() # 建立一個ClassInfo對象 2 c.class_name = '高三·三班' # 設置名字 3 c.class_num = 66 # 設置班級人數 4 c.save() # 調用save()方法 5 # 在查詢一下ClassInfo裏的數據 6 ClassInfo.objects.all() # 目標結果爲<QuerySet [<ClassInfo: ClassInfo object (1)>]>
數據已經插入了,接下來查詢一下id=1的對象數據
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這個對象修改這條數據裏面的信息 7 c.class_num = 54 8 c.save() 9 c.class_num # 這裏就會返回修改後的數據54
建立一個關聯ClassInfo的StudentInfo的數據
# 建立一個StudentInfo類的對象 s = StudentInfo() s.name = '李雷' s.age = 16 s.stu_class = c s.save() # 班級與學生是一對多的關係,django中提供了關聯的操做方式 # 得到關聯集合:返回當前班級對象的全部學生 c.studentinfo_set.all() # <QuerySet [<StudentInfo: StudentInfo object (1)>]>
如今這種狀況下想查看一下數據,真的是很不方便,若是在沒有相關數據庫軟件的時候,就只能在Shell中查看嗎?這裏Django還提供了一個後臺管理之類的東西,咱們將數據顯示在哪裏試一下
打開untitled/settings.py文件,找到語言編碼、時區的設置項,將內容改成以下:
LANGUAGE_CODE = 'zh-hans' # 設置中文 TIME_ZONE = 'Asia/Shanghai' # 設置時區
# 建立命令 python manage.py createsuperuser # 接下來就是設置用戶名、郵箱、密碼 # 啓動服務器 python manage.py runserver # 而後能夠打開瀏覽器查看是否成功 # 127.0.0.1:8000/admin/
打開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這個應用被添加進來
打開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)
刷新頁面,數據就會顯示出來了
Django給我提供的管理頁面,咱們沒有寫,若是配置頁面的規則,可是瀏覽器就能找到,這是由於Django默認給咱們陪着了這個頁面的信息,那麼接下來咱們就來了解一下定義視圖,配置URLconf,對於Django的設計框架MVT,用戶在URL中請求的視圖,視圖接受請求後進行處理,並將處理的結果返回給請求者
使用視圖時須要進行兩部操做:
1.定義視圖函數
2,配置URLconf
打開test1/views.py,定義視圖:
from django.http import HttpResponse # Create your views here. def index(request): return HttpResponse('測試')
完成URLconf配置
# untitled項目中的urls.py from django.contrib import admin from django.urls import path from django.conf.urls import include, url urlpatterns = [ path( 'admin/', admin.site.urls ), url( r'^', include( 'test1.urls' ) ) ]
# test1應用中urls.py from django.conf.urls import url from test1 import views urlpatterns = [ url(r'^index$', views.index), ]
接下來就在瀏覽器中測試一下
在Django中將前端的內容定義在模板中,而後再把模板交給視圖調用。就能夠完成以上的操做。
那麼問題來了,每一個模塊都有本身的歸屬,模板的歸屬在哪裏,若是你是用Pycharm生成的項目,你就會發現有一個空文件夾一直未使用,他的名字就叫 templates
這裏我會在templates裏建立一個和應用名同樣的文件夾,來存儲這個應用所使用的頁面,那麼就讓咱們動手來建立吧
這樣就算完成了嗎?並無,如今你就須要讓去配製一下它的路徑,讓咱們的程序要到它
首先打開test4/settings.py文件,設置TEMPLATES的DIRS值
DIRS': [os.path.join(BASE_DIR, 'templates')],
在你剛剛建立的index.html開始書寫你的網頁
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>
這裏必定會發現一堆亂七八糟的東西,出如今你的視線裏。
<!--在模板中輸出變量,變量多是從視圖中傳遞過來的,也多是在模板中定義的--> {{變量名}} <!--下面就是模板使用代碼段的方式--> {%代碼段%}
既然視圖中能夠傳值過來,那麼怎麼傳?暫時先不告訴你明白下面的內容,你天然就會懂得
調用模板的三個步驟:
這裏就來找到視圖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))
刷新你的瀏覽器,會給你一個驚喜
那麼每次都須要寫的那麼煩嗎?你學的但是Python,那麼固然並不用
視圖調用模板要執行以上三部分,因而Django提供了一個函數render封裝了以上代碼,方法render包含3個參數
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)
刷新頁面有驚喜
下面經過數據庫咱們來鞏固一下上面囉嗦的一堆
在開始寫代碼以前,考慮一下我都須要什麼
修改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 ClassInfo def 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): """顯示學生詳情""" 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 views urlpatterns = [ url(r'index$', views.index), # \d+ 表示多個數字 也就是匹配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>