Django之流程梳理
一,設計模型
MVC模型:
優點,降低程式碼的耦合性
Model(模型):處理資料邏輯部分,通常是儲存資料
Views(檢視):展示資料部分,
Controller(控制器):應用程式中處理使用者互動的部分
MTV模型:
Model(模型):負責業務物件和資料庫的物件
Telmplate(模板):負責如何把頁面展示給使用者
View(檢視):負責業務邏輯,並在適當的時候呼叫Model和Template
請求鏈路:
頁面發起url請求-->根據url去匹配相應的檢視函式-->檢視去model裡取資料(model去資料庫中取資料)-->將資料返回的view檢視-->把要展示的資料返回給Template-->再返回到HTML檔案
Django的操作流程
1,首先建立一個專案
django-admin startproject 專案名
使用此命令可以檢視建立的目錄的結構(tree . /F)
│ manage.py(一個命令列工具,可以使我們有多種方式與Django進行互動)
│
└─project
asgi.py
settings.py(專案的配置檔案)
urls.py(專案的url宣告,路由)
wsgi.py
__init__.py
基本操作:
1,設計表結構(首先需要資料庫裡面存資料,比如設定一個學生資料庫表)
2,配置資料庫
首先需要引入pyMySql
在__init__.py中寫入兩行程式碼:
import pymysql pymysql.install_as_MySQLdb()
在settings.py檔案中的DATABASES中配置資料庫:
DATABASES = { "default": { "ENGINE": "django.db.backends.mysql", "NAME": "zcr", "USER": "root", "PASSWORD": "root", "HOST": "127.0.0.1", "PORT": "3306" } }
3,建立應用(在一個專案中可以建立多個應用,每個應用進行一個業務處理)
進入project專案下(和manage.py檔案同級):執行下面的命令
python manage.py startapp myApp
│ admin.py(站點配置)
│ apps.py
│ models.py(模型檔案)
│ tests.py
│ views.py(檢視檔案)
│ __init__.py
│
└─migrations
__init__.py
4,啟用應用
在settings檔案中,將應用加入到INSTALLED_APPS中
5,定義模型(有一個數據表,就應對應一個模型裡的一個class)比如下面的班級表和學生表
在model.py檔案中定義模型:模型類要繼承models.model(ps:不需要設定主鍵,會自動增加)
from django.db import models # Create your models here. # 類對應資料庫中的一張表,表中的欄位對應資料庫中的屬性 class Grades(models.Model): gname = models.CharField(max_length=20) gdate = models.TimeField() ggirlnum = models.IntegerField() gboynum = models.IntegerField() isDelete = models.BooleanField() class Students(models.Model): #設定為字串型別 sname = models.CharField(max_length=20) #設定為布林值 sgend = models.BooleanField(default=True) #設定為整數值 sage = models.IntegerField() scontend = models.CharField(max_length=100) isDelete = models.BooleanField(default=False) # 設定外來鍵關聯,如果不加on_delete的話,執行python manage.py makemigrations會報錯
sgrade = models.ForeignKey(Grades,on_delete=models.CASCADE)
6,生成資料表(用程式碼生成資料表)
1,生成遷移檔案:python manage.py makemigrations,執行後會在migrations目錄下的遷移檔案,此時資料庫中還沒有生成表
2,執行遷移:python manage.py migrate,執行後,在資料庫中會生成對應的表,使用desc 表名,查看錶結構
7,測試操作資料:
1,進入到測試環境:python manage.py shell(每次進入虛擬環境都要導包)
2,在該環境下引入包:比如在models裡建立的類(因為要對他們進行操作):
from myApp.models import Grades,Students
from django.utils import timezone
from time import *
3,在該環境下執行sql語句:
查看錶中的所有資料:<class name>.objects.all()
新增資料(本質是建立一個模型類的物件例項):如果要新增多條的話,再建立一個物件就可
grad1=Grades() grad1.gname = 'python04' grad1.gdate = datetime(year=2020, month=12, day=8) grad1.ggirlnum=10 #建立好之後,還需要儲存 grad1.save()
4,檢視某個物件:Grades.objects.get(pk=2)
5,修改資料:
先將物件的值重新賦值:列如(grad1.ggirlnum=30)然後再儲存grad1.save()
6,刪除資料:grad1.delete()物理刪除(刪了就刪了)
7, 關聯資料插入
#需要先將班級的資訊賦值到物件中,然後將班級物件的值賦值給學生物件 >>> grad1=Grades.objects.get(pk=1) >>> stu.sname="薛豔梅" >>> stu.sgend=False >>> stu.sage=26 >>> stu.scontend="我叫薛豔梅,我長的很好看" >>> stu.sgrade=grad1 >>> stu.save()
8,檢視所有關聯表中的資料:
grad1.students_set.all():類名.關聯類名的小寫_ste.all()
9,直接插入關聯表的資料(我直接建立一個學生,新增到python04這個班級中),這個不用save(),直接就新增到資料庫中了
stu3 =grad1.students_set.create(sname=u'蘇念秋',sgend=False,sage=25,scontend=u'我是六魁首之一的蘇家家主')
8,啟動伺服器:
啟動格式:python manage.py runserver ip:port(ip可以不寫,預設是本機地址,埠號可以不寫,預設是8000)
說明:這是一個python寫的輕量級伺服器,僅只是在開發中測試使用
9,admin站點管理
概述:
內容釋出:負責新增,修改,刪除內容
公告訪問:
配置admin檔案:
在settings.py配置檔案中的INSTALLED_APPS新增"django.contrib.admin"
建立管理員使用者:
執行命令:python manage.py createsuperuser
進入使用者管理頁面:在啟動的伺服器地址後面加上/admin即可(http://127.0.0.1:8000/admin/)
漢化:將settings.py檔案中的引數修改為如下的即可
#設定為簡體中文 LANGUAGE_CODE = 'zh-Hans' #設定時區 TIME_ZONE = 'Asia/Shanghai'
管理資料表:在admin.py檔案中新增如下程式碼,將model中的資料庫拿過來
from django.contrib import admin # Register your models here. from .models import Grades,Students #註冊,配置完之後,在伺服器啟動頁面,重新整理一下,即可看到新增的兩個資料表 admin.site.register(Grades) admin.site.register(Students)
自定義管理頁面:比如頁面欄位的展示,過濾,搜尋,分頁,修改欄位新增的順序和給欄位分組
1,先定義一個類,並且這個類繼承於admin.ModelAdmin
2,定義好之後將類新增到上一步中的admin.site,register(Grades,GradesAdmin)
from django.contrib import admin # Register your models here. from .models import Grades, Students # 註冊,配置完之後,在伺服器啟動頁面,重新整理一下,即可看到新增的兩個資料表 class GradesAdmin(admin.ModelAdmin): # 列表頁屬性 #list_display顯示model裡資料表中的欄位 list_display = ['pk', 'gname', 'gdate', 'ggirlnum', 'gboynum', 'isDelete'] #list_filter,過濾器,可以根據設定的欄位值來篩選資料 list_filter = ['ggirlnum'] #search_fields,搜尋欄位,根據欄位進行搜尋 search_fields = ['gname'] #頁面資料展示,也設定的值為多少條每頁 list_per_page = 1 # 新增,修改屬性 # fields修改屬性的先後順序,管理頁面預設有新增 #fields = ['gdate','isDelete','ggirlnum', 'gboynum','gname'] #fieldsets給屬性分組 #注意,fields與 fieldsets不能同時使用 fieldsets = [ ("Num",{"fields":['ggirlnum','gboynum']}), ("Base",{"fields":['gdate','gname','isDelete']}), ] class StudentsAdmin(admin.ModelAdmin): list_display = ['pk', 'sname', 'sgend', 'scontend', 'isDelete', 'sgrade'] list_per_page = 1 admin.site.register(Grades, GradesAdmin) admin.site.register(Students, StudentsAdmin)
3,關聯物件,需求:在班級表建立時,預設可以新增幾個學生(如下程式碼所示)該繼承於TabularInLine,還有StackedInline
#有一個需求:在關聯的班級表建立的時候,同時新增幾個學生 class StudentsInfo(admin.TabularInline): #模型繼承於哪個類,即在建立班級的時候,預設建立幾個學生(關聯表) model = Students #預設建立的學生人數 extra = 2 #還需要在主表即被關聯表中新增如下程式碼此表是Grades
#inlines = [StudentsInfo]
4,布林值顯示問題:在相應的資料表中,定義一個方法,判斷該欄位是否是ture,如果是則返回男,false則返回女
class StudentsAdmin(admin.ModelAdmin): #布林值顯示問題,判斷該欄位是否是ture,如果是則返回男,false則返回女 def gend(self): if self.sgend: return '男' else: return '女' def ISDelete(self): if self.isDelete: return '是' else: return '否' #然後在list_display裡呼叫該方法即可 list_display = ['pk', 'sname', gend, 'scontend', ISDelete, 'sgrade'] list_per_page = 10
5,改表頭的英文欄位展示為中文:
def gend(self): if self.sgend: return '男' else: return '女' def ISDelete(self): if self.isDelete: return '是' else: return '否' gend.short_description = '性別'
6,頁面執行動作的位置問題:
actions_on_top = False
actions_on_bottom = True
7,實際中使用的註冊:
@admin.register(Students) # admin.site.register(Students, StudentsAdmin) class StudentsAdmin(admin.ModelAdmin): #布林值顯示問題,判斷該欄位是否是ture,如果是則返回男,false則返回女 def gend(self): if self.sgend: return '男' else: return '女' def ISDelete(self): if self.isDelete: return '是' else: return '否' gend.short_description = '性別' #然後在list_display裡呼叫該方法即可 list_display = ['pk', 'sname', gend, 'scontend', ISDelete, 'sgrade'] list_per_page = 10
檢視(views)的使用
1,概述:檢視(views)就是一個python函式,在views.py檔案中定義,
2,定義檢視,如下所示,一個def就相當於是一個html頁面,路徑
from django.shortcuts import render from django.http.response import HttpResponse,JsonResponse # Create your views here. #方法都是需要一個request引數請求體 def index(request): #返回需要HttpResponse類 return HttpResponse("django is good man") def html1(request): return HttpResponse("{'admin':'zcr'}")
3,配置url:
首先,在應用中新建一個urls.py檔案,並在其中進行配置,將views.py中的class和myApp.urls管理起來
#首先匯入views檢視檔案 from . import views #匯入django的path from django.urls import path urlpatterns = [ #新版本的django不推薦使用url了,都是用的path,如果要支援正則表示式的話需要用re_path #對應的是views中的index方法 path(r'index/',views.index), #對應的是views中的html1方法 path(r'html1/',views.html1) ]
然後,在專案的urls.py檔案中將應用中的urls.py檔案關聯起來
from django.contrib import admin from django.urls import path,include,re_path urlpatterns = [ path('admin/', admin.site.urls), #將應用myApp中的urls檔案和專案中的urls檔案關聯起來 path(r'',include('myApp.urls')), ]
模板的使用
概述:模板是Html頁面,根據views.py檔案傳遞過來的資料進行填充
模板的建立:和應用同級,在專案projenct下建立templates檔案(directory)
配置模板路徑:
修改settings.py檔案下的Templates裡的BASE_DIR(這個就是專案在電腦裡的目錄)如下圖所示
BASE_DIR = Path(__file__).resolve().parent.parent #C:\Users\wb-zcr702260\PycharmProjects\untitled1\project print(BASE_DIR)
然後在Templates裡面的dirs設定路徑
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', #引入os類目,將templates路徑新增到這裡 'DIRS': [os.path.join(BASE_DIR,'templates')], 'APP_DIRS': True,
ps:模板下面可以對應多個應用的檢視,比如在模板下新建一個myApp,那這個檔案下的模板對應的都是myApp下的所有模板
建立模板(比如在templates/myApp目下建立grades.html模板和students.html模板)
模板語法:
{{輸出值,可以是變數,也可以是物件.屬性}}
{%執行程式碼段%}
從模板到可以顯示html的流程比如這個路徑顯示(http://127.0.0.1:8000/grades/)
1,先建立好模板html檔案,編寫如何顯示前端頁面(比如建立的grades.html檔案)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>班級資訊</title> </head> <body> <h1>班級資訊列表</h1> <ul> {%for grade in grades%} <li> <a href="#"> {{grade.gname}}} </a> </li> {%endfor%} </ul> </body> </html>
2,模板html檔案編寫好之後,需要去設定views.py檢視檔案,如下圖所示(檢視主要是獲取資料給templates下的html檔案)
#從模型中(資料庫中)拿到資料
from .models import Grades,Students def grades(request): #從模型裡面取出資料 gradesList=Grades.objects.all() #將資料傳遞給模板,模板再渲染頁面,將渲染好的頁面返回給瀏覽器 #其中render(請求引數request,模板的名稱,傳遞的值(grades是模板裡的執行程式碼)),其中模板的路徑,只需要配置Html檔案在templates下面的路徑即可了 return render(request,'myApp/grades.html',{"grades":gradesList})
3,配置好url路徑,如下圖所示(將檢視和url關聯起來)
from django.urls import path, re_path urlpatterns = [ # 新版本的django不推薦使用url了,都是用的path,如果要支援正則表示式的話需要用re_path # 對應的是views中的index方法 re_path(r'index/', views.index), # 對應的是views中的html1方法 path(r'html1/', views.html1), path(r'detail/', views.detail), #配置views中的類的路徑 path(r'grades/', views.grades) ]
需求:根據班級號,拿到班級下的所有學生資訊:程式碼如下
<h1>班級資訊列表</h1> <ul> {%for grade in grades%} <li> <a href="{{grade.id}}"> {{grade.gname}} </a> </li> {%endfor%} </ul>
2,編輯views檢視檔案
def studentGrade(request,num): gradeid=Grades.objects.get(pk=num) studentsList1=gradeid.students_set.all() return render(request,'myApp/students.html',{'students1':studentsList1})
3,配置urls路徑
urlpatterns = [ # 新版本的django不推薦使用url了,都是用的path,如果要支援正則表示式的話需要用re_path # 對應的是views中的index方法 re_path(r'^grades/(\d)$',views.studentGrade) ]