瞭解Django的 MVT 架構的使用流程css
使用Django完成案例 : 書籍信息管理html
MVC:全拼爲Model-View-Controller。前端
Model:簡稱爲M,主要封裝對數據庫層的訪問,內嵌ORM框架,實現面向對象編程來操做數據庫。python
View:簡稱V,用於封裝結果,內嵌了模板引擎,實現動態展現數據。web
Controller:簡稱C,用於接收GET或POST請求,處理業務邏輯,與Model和View交互,返回結果。正則表達式
備註:當前主流的開發語言如Java、PHP、Python....中都有MVC設計模式。sql
MTV:全拼爲Model-View-Templateshell
Model:簡稱M,與MVC中的M功能相同,負責與數據庫交互,處理數據,內嵌了ORM框架。數據庫
View:簡稱V,與MVC中的C功能相同,接收HttpRequest,業務處理邏輯,返回HttpResponse。django
Template:簡稱T,與MVC中的V功能相同,負責封裝構造返回的html,內嵌了模板引擎。
備註:MTV和MVC的差別在於MTV中的View是處理業務邏輯的,然而MVC中的V是處理內置模板引擎的。MTV中的T處理的是網頁html模板的。MVC中的C纔是處理業務邏輯的。
總結:出來Django重點就是研究Model-View-Template三個模塊間如何協同工做以及各自模塊的代碼的編寫。
設計模式(MVC):是一套反覆使用,多數人知曉,分類代碼設計經驗的總結。
目的:爲了代碼可重複用,讓代碼更容易被別人理解,保障代碼可靠性。
設計模式使代碼工程化
設計模式是軟件工程的基石脈絡。
一、當前的項目開發,都是以數據驅動視圖的。
二、書籍信息管理的數據關係:書籍和人物是:一對多關係
三、要先分析出項目中所須要的數據,而後設計數據庫表。
一、建立Django項目(進入到pycharm目錄下):
django-admin startproject DjangoName(項目名稱)
二、命令行進入DjangoName項目名稱下建立應用:
python manage.py startapp web(應用名稱)
一、MTV設計模式的Model,專門負責和數據庫交互,對應(models.py)
二、因爲Model中內嵌了ORM框架,因此不須要直接面向數據庫編程。
三、定義模型類,經過模型類和對象完成數據庫表的增刪改查
四、ORM框架就是把數據庫表的行與對應的對象創建關聯,互相轉換,使得數據庫的操做面向對象。
1)根據書籍結構設計模型類
模型類:Book
書籍名稱字段:name
2)根據人物表結構設計模型類
模型類:Author
人物姓名字段:name
人物性別字段:gender
外鍵約束:book_id
外鍵要指定所屬的模型類book = models.ForeignKey(Book)
說明:書籍與人物的關係:一對多,一本書能夠有多個做者
不須要定義主鍵字段,在生成表會自動添加,而且值爲自動增加。
根據數據庫表的設計:
在models.py中定義模型類,繼承來自models.Model
from django.db import models # Create your models here. # 建立人物列表信息的模型類 class Author(models.Model): # 添加名字,性別 name = models.CharField(max_length=10) gender = models.BooleanField() # 開始建立書籍列表信息的模型類 繼承models.Model class Book(models.Model): # 建立字段,字段類型,以及字段長度設置 name = models.CharField(max_length=10) # 添加外鍵約束,這個本書屬於哪一個做者寫的 auth_id = models.ForeignKey(Author,on_delete=models.CASCADE)
# 模型類準備好後,建立和執行遷移==建表
一、遷移由兩步完成:
1)生成遷移文件:根據模型類生成建立表的語句
python manage.py makemigrations
2)執行遷移:根據第一步生成的語句在數據庫中建立表
python manage.py migrate
""" Django settings for BOOK project. Generated by 'django-admin startproject' using Django 2.0.2. For more information on this file, see https://docs.djangoproject.com/en/2.0/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/2.0/ref/settings/ """ import os # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = 'kxme+2djdv7fv!uss90xo@^g9^6fc)7%y^ck)v7dx(53kno=b5' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'web' ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'BOOK.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], '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', ], }, }, ] WSGI_APPLICATION = 'BOOK.wsgi.application' # Database # https://docs.djangoproject.com/en/2.0/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } # Password validation # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] # Internationalization # https://docs.djangoproject.com/en/2.0/topics/i18n/ LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/2.0/howto/static-files/ STATIC_URL = '/static/'
會出現報錯,須要去配置檢查是否添加app應用名字在INSTALLED_APPS中
報錯信息以下:
(venv) D:\PycharmProjects\practice\BOOK>python manage.py makemigrations web App 'web' could not be found. Is it in INSTALLED_APPS?
注意截圖中的sqlite3數據庫來儲存數據
經過模型類和對象完成數據庫表的增刪改查
進入項目的shell,進行簡單的增刪改查API操做
輸入quit()能夠退出shell
python manage.py shell
測試增刪改查API操做(在shell中)
# 引入應用中的模型類 from web.models import * # 建立人物模型對象 author = Author() author.name = 'sunwukong' author.gender = True # 外鍵查詢 : 查詢書的做者人物信息(author_set是隱式生成的) author.book_set.all() author .save() # 建立書籍模型對象 book = Book() # 新增記錄 book.name = '與時間作朋友' # 保存記錄 book.save() # 查詢記錄 Book.objects.all()#返回的是一個Queryset對象 # 刪除記錄 : 再查詢時,表裏數據爲空 book.delete()
author.delete() # 退出shell quit()
站點:分爲內容發佈和公共訪問兩個部分
內容發佈的部分由網站的管理員負責查看、添加、修改、刪除數據
Django可以根據定義的模型類自動地生成管理模塊
使用Django的管理模塊,須要按照如下步驟造做:
1)本地化就是將顯示的語言、時間等使用本地的習慣(中國化)
2)咱們使用的是簡體中文,時區使用亞洲/上海時區,注意這裏不能使用北京時區
本地化前:
本地化後:
二、建立管理員
建立管理員命令:
python manage.py createsuperuser
按照提示輸入用戶名、郵箱、密碼
啓動服務:
python manage.py runserver
登陸站點:http://127.0.0.1:8000/admin
登陸站點成功:(站點界面中沒有書籍和做者管理入口,是由於沒有註冊模型類)
三、註冊模型類
在應用的admin.py文件中註冊模型類
須要導入模型模塊:
from models import *
註冊模型後:
註冊模型成功後,就能夠在站點管理界面方便快速的管理數據
出現這個錯誤:
是一個bug,因此就升級一下Django吧,2.1.7以後就沒問題了。
發佈內容後,優化模型展現:
from django.db import models # Create your models here. # 建立人物列表信息的模型類 class Author(models.Model): # 添加名字,性別 name = models.CharField(max_length=10) gender = models.BooleanField() def __str__(self): return self.name # 開始建立書籍列表信息的模型類 繼承models.Model class Book(models.Model): # 建立字段,字段類型,以及字段長度設置 name = models.CharField(max_length=10) # 添加外鍵約束,這個本書屬於哪一個做者寫的 auth_id = models.ForeignKey(Author,on_delete=models.CASCADE) # 模型類準備好後,建立和執行遷移==建表 def __str__(self): return self.name
能夠選擇剛添加的信息作修改
自定義站點管理界面前
若是想在站點界面中展現詳細的字段信息,須要自定義管理頁面
即在應用的admin.py文件中須要從新註冊模型類
一、新建類繼承自admin.ModelAdmin
二、重寫list_display,指定須要展現的字段
三、將BookAdmin註冊到站點
from django.contrib import admin # Register your models here. #導入模型 from web.models import * #註冊做者模型 admin.site.register(Author) #爲了在管理站點中顯示書籍字段信息,須要從新註冊模型類 class BookAdmin(admin.ModelAdmin): list_display = ["id","name","auth_id"] #註冊書籍信息模型 admin.site.register(Book,BookAdmin) #註冊書籍模型 # admin.site.register(Book)
視圖和URL:
公共訪問
的頁面了.Django
的設計框架MVT
.
一、定義視圖:
Python
函數,被定義在應用
的views.py
中.HttpRequest
類型的對象reqeust
,包含了全部請求信息
.HttpResponse對象
,包含返回給請求者的響應信息
.須要導入HttpResponse
模塊 : from django.http import HttpResponse
定義視圖函數 : 響應字符串OK!
給客戶端
二、配置URLconf
查找視圖的過程:
一、請求者在瀏覽器地址欄輸入url,請求到網站
二、網站獲取url信息
三、而後與編寫好的URLconf逐條配對
四、若是匹配成功則調用對應的視圖
五、若是全部的URLconf都沒有匹配成功,則返回404錯誤
URLconf入口:
URL規則使用正則表達式定義
視圖就是在views.py中定義視圖函數
總結View和URL匹配流程:
提示:漂亮的頁面須要html、css、js,能夠把這一堆字符串全都寫到視圖中,做爲HttpResponse()的參數,響應給客戶端
因爲這樣寫,重複度高,有錯誤也不容易查看,檢查。所以有一個專門定義前端的地方,效果能夠即便展現,錯誤也更容易發現。因而模板就出現了。
Template:MTV設計模式的T,在Django中,將前端的內容定義在模板中,而後再把模板交給視圖函數,視圖函數渲染好,傳給瀏覽器,因而酷炫效果出現了。
一、建立模板
在應用同級目錄下建立模板文件夾templates,文件夾名稱固定寫法。若是使用Pycharm建立的Django項目,那麼Pycharm已經自動幫你建好。在Templates文件下,
一、建立應用同名文件夾,例app01
二、在應用同名文件下,建立網頁模板文件例:index.html
二、設置模板查找路徑(settings.py)
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', #設置模板查找路徑 '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', ], }, }, ]
三、模板接受視圖傳入的數據
四、模板處理數據
五、查看數據處理成果(http://127.0.0.1:8000/)
看見傳入的鍵值對的值說明渲染成功。
總結View-Templates流程:
案例實現(展現書籍信息)
一、肯定訪問圖書列表信息的網址爲:http://127.0.0.1:8000/booklist/
二、項目路由分發urls.py
urlpatterns = [ path('admin/', admin.site.urls), path('booklist/', views.booklist), #應用中定義URLconf,包含到項目URLconf中 #正則:只要不是'admin/'就算匹配成功 re_path('^$', views.index), ]
三、建立應用視圖函數
*查詢數據庫數據
*構造上下文
*將上下文傳入模板
def booklist(request): #查詢數據庫書籍列表數據 bookslist = Book.objects.all() #構造上下文 content = {"bookslist":bookslist} #將數據交給模板處理,處理完成後經過視圖響應給客戶端 return render(request,"app01/booklist.html",content)
四、建立模板
*讀取上下文
*構造網頁html文檔:書籍以列表形式展現
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>書籍展現</title> </head> <body> {#遍歷列表用如下方式,模板處理數據#} <ul> {% for book in bookslist %} <li>{{ book.name }}</li> <li>{{ book.auth_id }}</li> {% endfor %} </ul> </body> </html>
案例實現(展現做者信息)
查詢做者信息的路由爲http://127.0.0.1:8000/authors/
一、配置路由
urlpatterns = [ path('admin/', admin.site.urls), path('booklist/', views.booklist), path('authors/', views.authors), #應用中定義URLconf,包含到項目URLconf中 #正則:只要不是'admin/'就算匹配成功 re_path('^$', views.index), ]
二、建立視圖
def authors(request): author = Author.objects.all() #構造上下文 content = {"author":author} #數據交給模板處理,處理完成經過視圖函數響應給客戶端 return render(request,"app01/authors.html",content)
三、建立模板
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>做者信息展現</title> </head> <body> <ul> {% for auth in author %} <li>{{ auth.name }}----{{ auth.gender }}</li> {% endfor %} </ul> </body> </html>