Django初識 學習筆記一
mvcviewsmodelstemplate.
一 MVC架構
MVC全名是Model View Controller,是模型(model)-視圖(view)-控制器(controller)的縮寫,一種軟體設計典範,用一種業務邏輯、資料、界面顯示分離的方法組織代碼,将業務邏輯聚集到一個部件裡面,在改進和個性化定制界面及使用者互動的同時,不需要重新編寫業務邏輯。MVC被獨特的發展起來用于映射傳統的輸入、處理和輸出功能在一個邏輯的圖形化使用者界面的結構中。
enter description here
-
Model(模型)是應用程式中用于處理應用程式資料邏輯的部分。
通常模型對象負責在資料庫中存取資料。
-
View(視圖)是應用程式中處理資料顯示的部分。
通常視圖是依據模型資料建立的。和html頁面有關系。
-
Controller(控制器)是應用程式中處理使用者互動的部分。
通常控制器負責從視圖讀取資料,控制使用者輸入,并向模型發送資料。接受請求,進行互動,與M和V進行互動,傳回應答。
二 MVT架構
Django也是MVC架構。 但是,Django架構(内部的URLconf)作為控制器的角色,負責了接收使用者請求和轉發請求的工作,Django 裡更關注的是模型(Model)、模闆(Template)和視圖(Views),故稱之為 Django MVT 模式處理過程: Django架構接收了使用者請求和參數後,再通過正規表達式比對URL,轉發給對應視圖進行處理。視圖調用M處理資料,再調用T傳回界面給浏覽器; enter description here - M:Model,模型, 和資料庫進行互動,和MVC中M功能相同
- V: View,視圖, 接受請求,進行互動,與M和V進行互動,傳回應答 和MVC中C 功能相同
- T: Template,模闆,産生html頁面,和MVC中的v功能相同
三 第一個Django項目
指令:django-admin startproject 項目名
項目目錄如下:
enter description here
- _init_.py: 說明test1是一個python包。
- settings.py: 項目的配置檔案
- urls.py: 進行url路由的配置
- wsgi.py: web伺服器和django互動的入口
- manage.py: 項目的管理檔案
一個項目由很多個應用組成的,每一個應用完成一個特定的功能。
建立應用的指令如下:
python manage.py startapp 應用名
應用目錄如下:
enter description here
- _init_.py: 說明目錄是一個python子產品
- models.py: 寫和資料庫相關的内容
- views.py: 接收請求,進行處理。和M,T互動,傳回應答,
- 定義處理函數,視圖函數
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
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
enter description here
遷移檔案是根據模型類生成的。
2) 執行遷移生成表
指令:
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 關系操作
enter description here
1)查詢出id為2的圖書中所有英雄人物的資訊。
b = BookInfo.objects.get(id=2)
b.heroinfo_set.all() #查詢出b圖書中所有英雄人物的資訊
五 背景管理
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: [email protected]
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配置
enter description here
url配置的目的是讓建立url和視圖函數的對應關系。url配置項定義在urlpatterns的清單中,每一個配置項都調用url函數。
url函數有兩個參數,第一個參數是一個正規表達式,第二個是對應的處理動作。
配置url時,有兩種文法格式:
a) url(正規表達式,視圖函數名)
b) url(正規表達式,include(應用中的urls檔案))
工作中在配置url時,首先在項目的urls.py檔案中添加配置項時,并不寫具體的url和視圖函數之間的對應關系,而是包含具體應用的urls.py檔案,在應用的urls.py檔案中寫url和視圖函數的對應關系。
項目的url.py:
urlpatterns = [
url(r'^admin/', include(admin.site.urls)), # 配置項目
url(r'^', include('booktest.urls')), # 包含booktest應用中的urls檔案
]
應用的url.py:
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和視圖函數的對應關系。
enter description here
當使用者輸入如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
enter description here
O:(objects)->類和對象。
R:(Relation)->關系,關系資料庫中的表格。
M:(Mapping)->映射。
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。
enter description here
頁面重定向:伺服器不傳回頁面,而是告訴浏覽器再去請求其他的url位址。
3)圖書資訊删除。
a)設計url,通過浏覽器通路 http://127.0.0.1:8000/delete數字/删除資料庫中對應的一條圖書資料。
其中數字是點選的圖書的id。
b)設計url對應的視圖函數delete。
擷取圖書的id,進行删除。