一、Django基礎
- 掌握Django的 MVT 架構的使用
- 掌握Git管理源代碼
主要内容
- 了解Django的 MVT 架構的使用流程
- 使用Django完成案例 : 書籍資訊管理
MVC介紹
MVC:全拼為Model-View-Controller。
Model:簡稱為M,主要封裝對資料庫層的通路,内嵌ORM架構,實作面向對象程式設計來操作資料庫。
View:簡稱V,用于封裝結果,内嵌了模闆引擎,實作動态展示資料。
Controller:簡稱C,用于接收GET或POST請求,處理業務邏輯,與Model和View互動,傳回結果。
備注:目前主流的開發語言如Java、PHP、Python....中都有MVC設計模式。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISM9AnYldnJwAzN9c3Pn5GcuQ0MlQ0MlcnW1JkbMNzaE9UNVR1T1MmaNhHMD5UMjpnT4NGVOVTRE1EeBRVT1UERNlHMT1UeBRVTxMGVNZXQU1UNFRUT5hzUNlXQU1UMjRVT2NmMiNnSywEd5ITW110MaZHetlVdO1GT0UERNl3YXJGc5kHT20ESjBjUIF2Lc12bj5SYphXa5VWen5WY35iclN3Ztl2Lc9CX6MHc0RHaiojIsJye.png)
MTV介紹
MTV:全拼為Model-View-Template
Model:簡稱M,與MVC中的M功能相同,負責與資料庫互動,處理資料,内嵌了ORM架構。
View:簡稱V,與MVC中的C功能相同,接收HttpRequest,業務處理邏輯,傳回HttpResponse。
Template:簡稱T,與MVC中的V功能相同,負責封裝構造傳回的html,内嵌了模闆引擎。
備注:MTV和MVC的差異在于MTV中的View是處理業務邏輯的,然而MVC中的V是處理内置模闆引擎的。MTV中的T處理的是網頁html模闆的。MVC中的C才是處理業務邏輯的。
總結:出來Django重點就是研究Model-View-Template三個子產品間如何協同工作以及各自子產品的代碼的編寫。
設計模式(MVC):是一套反複使用,多數人知曉,分類代碼設計經驗的總結。
目的:為了代碼可重複用,讓代碼更容易被别人了解,保障代碼可靠性。
設計模式使代碼工程化
設計模式是軟體工程的基石脈絡。
模型:
1、目前的項目開發,都是以資料驅動視圖的。
2、書籍資訊管理的資料關系:書籍和人物是:一對多關系
3、要先分析出項目中所需要的資料,然後設計資料庫表。
1、建立Django項目(進入到pycharm目錄下):
django-admin startproject DjangoName(項目名稱)
2、指令行進入DjangoName項目名稱下建立應用:
python manage.py startapp web(應用名稱)
使用Django進行資料庫開發的提示:
1、MTV設計模式的Model,專門負責和資料庫互動,對應(models.py)
2、由于Model中内嵌了ORM架構,是以不需要直接面向資料庫程式設計。
3、定義模型類,通過模型類和對象完成資料庫表的增删改查
4、ORM架構就是把資料庫表的行與對應的對象建立關聯,互相轉換,使得資料庫的操作面向對象。
使用Django進行資料庫的開發步驟:
1、定義模型類
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)
# 模型類準備好後,建立和執行遷移==建表
2、模型遷移
1、遷移由兩步完成:
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/\'
settings.py配置
會出現報錯,需要去配置檢查是否添加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資料庫來儲存資料
3、操作資料庫
通過模型類和對象完成資料庫表的增删改查
進入項目的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、管理界面本地化
1)本地化就是将顯示的語言、時間等使用本地的習慣(中國化)
2)我們使用的是簡體中文,時區使用亞洲/上海時區,注意這裡不能使用北京時區
本地化前:
本地化後:
2、建立管理者
建立管理者指令:
python manage.py createsuperuser
按照提示輸入使用者名、郵箱、密碼
啟動服務:
python manage.py runserver
登入站點:http://127.0.0.1:8000/admin
登入站點成功:(站點界面中沒有書籍和作者管理入口,是因為沒有注冊模型類)
3、注冊模型類
在應用的admin.py檔案中注冊模型類
需要導入模型子產品:
from models import *
注冊模型後:
注冊模型成功後,就可以在站點管理界面友善快速的管理資料
4、釋出内容到資料庫
出現這個錯誤:
是一個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
可以選擇剛添加的資訊做修改
5、自定義站點管理頁面
自定義站點管理界面前
如果想在站點界面中展示詳細的字段資訊,需要自定義管理頁面
即在應用的admin.py檔案中需要重新注冊模型類
1、建立類繼承自admin.ModelAdmin
2、重寫list_display,指定需要展示的字段
3、将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
- 使用者在URL中請求的是視圖.
- 視圖接收請求後進行處理.
- 并将處理的結果傳回給請求者.
- 使用視圖時需要進行兩步操作
- 1.定義視圖
- 2.配置URLconf
1、定義視圖:
- 視圖就是一個
函數,被定義在Python
的應用
中.views.py
- 視圖的第一個參數是
類型的對象HttpRequest
,包含了所有reqeust
.請求資訊
- 視圖必須傳回
,包含傳回給請求者的HttpResponse對象
.響應資訊
- 需要導入
子產品 :HttpResponse
from django.http import HttpResponse
- 定義視圖函數 : 響應字元串
給用戶端OK!
-
03-Django基礎概念和MVT架構
2、配置URLconf
查找視圖的過程:
1、請求者在浏覽器位址欄輸入url,請求到網站
2、網站擷取url資訊
3、然後與編寫好的URLconf逐條配對
4、如果比對成功則調用對應的視圖
5、如果所有的URLconf都沒有比對成功,則傳回404錯誤
URLconf入口:
需要完成URLconf配置
1)在應用中定義URLconf
URL規則使用正規表達式定義
視圖就是在views.py中定義視圖函數
3. 測試:請求通路http://127.0.0.1:8000/
總結View和URL比對流程:
模闆
提示:漂亮的頁面需要html、css、js,可以把這一堆字元串全都寫到視圖中,作為HttpResponse()的參數,響應給用戶端
由于這樣寫,重複度高,有錯誤也不容易檢視,檢查。是以有一個專門定義前端的地方,效果可以即使展示,錯誤也更容易發現。于是模闆就出現了。
Template:MTV設計模式的T,在Django中,将前端的内容定義在模闆中,然後再把模闆交給視圖函數,視圖函數渲染好,傳給浏覽器,于是酷炫效果出現了。
模闆的使用步驟
1、建立模闆
在應用同級目錄下建立模闆檔案夾templates,檔案夾名稱固定寫法。如果使用Pycharm建立的Django項目,那麼Pycharm已經自動幫你建好。在Templates檔案下,
1、建立應用同名檔案夾,例app01
2、在應用同名檔案下,建立網頁模闆檔案例:index.html
2、設定模闆查找路徑(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\',
],
},
},
]
3、模闆接受視圖傳入的資料
4、模闆處理資料
5、檢視資料處理成果(http://127.0.0.1:8000/)
看見傳入的鍵值對的值說明渲染成功。
總結View-Templates流程:
案例實作(展示書籍資訊)
1、确定通路圖書清單資訊的網址為:http://127.0.0.1:8000/booklist/
2、項目路由分發urls.py
urlpatterns = [
path(\'admin/\', admin.site.urls),
path(\'booklist/\', views.booklist),
#應用中定義URLconf,包含到項目URLconf中
#正則:隻要不是\'admin/\'就算比對成功
re_path(\'^$\', views.index),
]
3、建立應用視圖函數
*查詢資料庫資料
*構造上下文
*将上下文傳入模闆
def booklist(request):
#查詢資料庫書籍清單資料
bookslist = Book.objects.all()
#構造上下文
content = {"bookslist":bookslist}
#将資料交給模闆處理,處理完成後通過視圖響應給用戶端
return render(request,"app01/booklist.html",content)
views.py
4、建立模闆
*讀取上下文
*構造網頁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>
Templates/app01/booklist.html
案例實作(展示作者資訊)
查詢作者資訊的路由為http://127.0.0.1:8000/authors/
1、配置路由
urlpatterns = [
path(\'admin/\', admin.site.urls),
path(\'booklist/\', views.booklist),
path(\'authors/\', views.authors),
#應用中定義URLconf,包含到項目URLconf中
#正則:隻要不是\'admin/\'就算比對成功
re_path(\'^$\', views.index),
]
2、建立視圖
def authors(request):
author = Author.objects.all()
#構造上下文
content = {"author":author}
#資料交給模闆處理,處理完成通過視圖函數響應給用戶端
return render(request,"app01/authors.html",content)
3、建立模闆
<!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>