1. 程式人生 > 實用技巧 >Django之流程梳理

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)
]