MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟件設計典範,用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯彙集到一個部件裏面,在改進和個性化定製界面及用戶交互的同時,不須要從新編寫業務邏輯。MVC被獨特的發展起來用於映射傳統的輸入、處理和輸出功能在一個邏輯的圖形化用戶界面的結構中。html
Model(模型)是應用程序中用於處理應用程序數據邏輯的部分。
一般模型對象負責在數據庫中存取數據。python
View(視圖)是應用程序中處理數據顯示的部分。
一般視圖是依據模型數據建立的。和html頁面有關係。mysql
Controller(控制器)是應用程序中處理用戶交互的部分。
一般控制器負責從視圖讀取數據,控制用戶輸入,並向模型發送數據。接受請求,進行交互,與M和V進行交互,返回應答。web
Django也是MVC框架。 可是,Django框架(內部的URLconf)做爲控制器的角色,負責了接收用戶請求和轉發請求的工做,Django 裏更關注的是模型(Model)、模板(Template)和視圖(Views),故稱之爲 Django MVT 模式處理過程: Django框架接收了用戶請求和參數後,再經過正則表達式匹配URL,轉發給對應視圖進行處理。視圖調用M處理數據,再調用T返回界面給瀏覽器;正則表達式
M:Model,模型, 和數據庫進行交互,和MVC中M功能相同sql
V: View,視圖, 接受請求,進行交互,與M和V進行交互,返回應答 和MVC中C 功能相同shell
T: Template,模板,產生html頁面,和MVC中的v功能相同數據庫
命令:django-admin startproject 項目名django
項目目錄以下:vim
一個項目由不少個應用組成的,每個應用完成一個特定的功能。
建立應用的命令以下:
python manage.py startapp 應用名
應用目錄以下:
tests.py:寫測試代碼的函數
admin.py: 網站後臺管理相關的文件
創建應用和項目之間的聯繫,須要對應用進行註冊。(項目不知道應用在)
修改settings.py中的INSTALLED_APPS配置項。
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'booktest', # 進行應用的註冊 )
運行開發web服務器命令:
python manage.py runserver
ORM:Object Relational Mapping(關係對象映射)
django中內嵌了ORM框架,ORM框架能夠將類和數據表進行對應起來,只須要經過類和對象就能夠對數據表進行操做。
設計類:模型類。
ORM另一個做用:根據設計的類生成數據庫中的表。
它的做用是在關係型數據庫和業務實體對象之間做一個映射,這樣,咱們在具體的操做業務對象的時候,就不須要再去和複雜的SQL語句打交道,只需簡單的操做對象的屬性和方法。
4.1 模型類設計
在應用models.py中設計模型類。必須繼承與models.Model類。
1) 設計BookInfo類。
2) 設計HeroInfo類。
Models.ForeignKey能夠創建兩個模型類之間一對多的關係,django在生成表的時候,就會在多的表中建立一列做爲外鍵,創建兩個表之間一對多的關係。
from django.db import models # 設計和表對應的類,模型類 # Create your models here. # 一類 # 圖書類 class BookInfo(models.Model): '''圖書模型類''' # 圖書名稱,CharField說明是一個字符串,max_length指定字符串的最大長度 btitle = models.CharField(max_length=20) # 出版日期,DateField說明是一個日期類型 bpub_date = models.DateField() def __str__(self): # 返回書名 return self.btitle # 多類 # 英雄人物類 # 英雄名 hname # 性別 hgender # 年齡 hage # 備註 hcomment # 關係屬性 hbook,創建圖書類和英雄人物類之間的一對多關係 class HeroInfo(models.Model): '''英雄人物模型類''' hname = models.CharField(max_length=20) # 英雄名稱 # 性別,BooleanField說明是bool類型,default指定默認值,False表明男 hgender = models.BooleanField(default=False) # 備註 hcomment = models.CharField(max_length=128) # 關係屬性 hbook,創建圖書類和英雄人物類之間的一對多關係 # 關係屬性對應的表的字段名格式: 關係屬性名_id hbook = models.ForeignKey('BookInfo') def __str__(self): # 返回英雄名 return self.hname
4.2 模型類生成表
1) 生成遷移文件
命令:python manage.py makemigrations
python mange.py migrate
4.3 經過模型類操做數據表
進入項目shell的命令:
python manage.py shell
4.4 如下爲在相互shell終端中演示的例子:
首先導入模型類:
from booktest.models import BookInfo,HeroInfo
1)向booktest_bookinfo表中插入一條數據。
b = BookInfo() #定義一個BookInfo類的對象
b.btitle ='天龍八部' #定義b對象的屬性並賦值
b.bpub_date = date(1990,10,11)
b.save() #纔會將數據保存進數據庫
2)查詢出booktest_bookinfo表中id爲1的數據。
b = BookInfo.objects.get(id=1)
3)在上一步的基礎上改變b對應圖書的出版日期。
b.bpub_date = date(1989,10,21)
b.save() #纔會更新表格中的數據
4)緊接上一步,刪除b對應的圖書的數據。
b.delete() #纔會刪除
5)向booktest_heroInfo表中插入一條數據。
h = HeroInfo()
h.hname = '郭靖'
h.hgender = False
h.hcomment = ‘降龍十八掌’
b2 = BookInfo.objects.get(id=2)
h.hbook = b2 #給關係屬性賦值,英雄對象所屬的圖書對象
h.save()
6)查詢圖書表裏面的全部內容。
BookInfo.objects.all()
HeroInfo.objects.all()
4.5 關係操做
1) 本地化
語言和時區的本地化。
修改settings.py文件。
# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans' # 使用中文
# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai' # 中國時間
2) 建立管理員
命令:python manage.py createsuperuser
C:\Django\test1>python manage.py createsuperuser
You have 3 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth.
Run 'python manage.py migrate' to apply them.
Username (leave blank to use 't_maj'): admin
Error: That username is already taken.
Username (leave blank to use 't_maj'): Cosmo
Email address: cosmo.ma@outlook.com
Password:
Password (again):
Superuser created successfully.
3) 註冊模型類
在應用下的admin.py中註冊模型類。
告訴djang框架根據註冊的模型類來生成對應表管理頁面。
b = BookInfo()
str(b) str
4) 自定義管理頁面
自定義模型管理類。模型管理類就是告訴django在生成的管理頁面上顯示哪些內容。
在Django中,經過瀏覽器去請求一個頁面時,使用視圖函數來處理這個請求的,視圖函數處理以後,要給瀏覽器返回頁面內容。
6.1 視圖函數的使用
1)定義視圖函數
視圖函數定義在views.py中。
例:
def index(request):
#進行處理。。。
return HttpResponse('hello python')
視圖函數必須有一個參數request,進行處理以後,須要返回一個HttpResponse的類對象,hello python就是返回給瀏覽器顯示的內容。
2)進行url配置
urlpatterns = [
url(r'^admin/', include(admin.site.urls)), # 配置項目
url(r'^', include('booktest.urls')), # 包含booktest應用中的urls文件
]
urlpatterns = [
# 經過url函數設置url路由配置項
url(r'^index$', views.index), # 創建/index和視圖index之間的關係
url(r'^index2$', views.index2),
url(r'^books$', views.show_books), # 顯示圖書信息
url(r'^books/(\d+)$', views.detail), # 顯示英雄信息
]
6.2 url匹配的過程
在項目的urls.py文件中包含具體應用的urls.py文件,應用的urls.py文件中寫url和視圖函數的對應關係。
當用戶輸入如http://127.0.0.1:8000/aindex時,去除域名和最前面的/,剩下aindex,拿aindex字符串到項目的urls文件中進行匹配,配置成功以後,去除匹配的a字符,那剩下的index字符串繼續到項目的urls文件中進行正則匹配,匹配成功以後執行視圖函數index,index視圖函數返回內容hello python給瀏覽器來顯示。
模板不單單是一個html文件。
7.1 模板文件的使用
1) 建立模板文件夾
2) 配置模板目錄
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',
],
},
},
]
使用模板文件
a) 加載模板文件
去模板目錄下面獲取html文件的內容,獲得一個模板對象。
b) 定義模板上下文
向模板文件傳遞數據。
c) 模板渲染
獲得一個標準的html內容。
from django.template import loader,RequestContext
def my_render(request, template_path, context_dict={}):
'''使用模板文件'''
# 使用模板文件
# 1.加載模板文件, 模板對象
temp = loader.get_template(template_path)
# 2.定義模板上下文:給模板文件傳遞數據
context = RequestContext(request, context_dict)
# 3.模板渲染:產生標準的html內容
res_html = temp.render(context)
# 4.返回給瀏覽器
return HttpResponse(res_html)
7.2 給模板文件傳遞數據
模板變量使用:{{ 模板變量名 }}
模板代碼段:{%代碼段%}
for循環:
{% for i in list %}
{% endfor %}
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>模板文件</title> </head> <body> <h1>這是一個模板文件</h1> 使用模板變量:<br/> {{ content }}<br/> 使用列表:<br/> {{ list }}<br/> for循環:<br/> <ul> {% for i in list %} <li>{{ i }}</li> {% endfor %} </ul> </body> </html>
8.1 Django ORM
ORM框架的功能:
a) 可以容許咱們經過面向對象的方式來操做數據庫。
b) 能夠根據咱們設計的模型類幫咱們自動生成數據庫中的表格。
c) 經過方便的配置就能夠進行數據庫的切換。
8.2 數據庫配置
mysql命令回顧:
登陸mysql數據庫:mysql –uroot –p
查看有哪些數據庫:show databases;
建立數據庫:create database test2 charset=utf8; #切記:指定編碼
使用數據庫:use test2;
查看數據庫中的表:show tables;
Django配置使用mysql數據庫:
修改settings.py中的DATABASES。
DATABASES = { 'default': { # 'ENGINE': 'django.db.backends.sqlite3', 'ENGINE': 'django.db.backends.mysql', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 'NAME': 'bj18', # 使用的數據庫的名字,數據庫必須手動建立 'USER': 'root', # 連接mysql的用戶名 'PASSWORD': 'mysql', # 用戶對應的密碼 'HOST': 'localhost', # 指定mysql數據庫所在電腦ip 'PORT': 3306, # mysql服務的端口號 } }
注意:django框架不會自動幫咱們生成mysql數據庫,因此咱們須要本身去建立。
8.3 切換mysql數據庫以後不能啓動服務器
須要安裝操做mysql數據庫的包,python2環境和python3環境有如下區別。
a) python2須要安裝mysql-python:
pip install mysql-python
b) python3須要安裝pymysql:
pip install pymysql
python3中安裝好pymysql,須要在test2/init.py中加以下內容:
import pymysql
pymysql.install_as_MySQLdb()
8.4 複習案例
設計模型類並生成表
a) 設計BookInfo,增長屬性bread和bcomment,另外設置軟刪除標記屬性isDelete。
b) 設計HeroInfo類,增長軟刪除標記屬性isDelete。
軟刪除標記:刪除數據時不作真正的刪除,而是把標記數據設置爲1表示刪除,目的是防止重要的數據丟失。
編寫視圖函數並配置URL。
3)建立模板文件。
拆解功能:
圖書信息展現頁。
a) 設計url,經過瀏覽器訪問 http://127.0.0.1:8000/index時顯示圖書信息頁面。
b) 設計url對應的視圖函數index。
查詢出全部圖書的信息,將這些信息傳遞給模板文件。
c) 編寫模板文件index.html。
遍歷顯示出每一本圖書的信息並增長新建和刪除超連接。
2)圖書信息新增。
a)設計url,經過瀏覽器訪問 http://127.0.0.1:8000/create/時向數據庫中新增一條圖書信息。
b) 設計url對應得視圖函數create。
頁面重定向:服務器不返回頁面,而是告訴瀏覽器再去請求其餘的url地址。
3)圖書信息刪除。
a)設計url,經過瀏覽器訪問 http://127.0.0.1:8000/delete數字/刪除數據庫中對應的一條圖書數據。 其中數字是點擊的圖書的id。 b)設計url對應的視圖函數delete。 獲取圖書的id,進行刪除。