Django介紹與框架整合,并使用MySQL實(shí)現(xiàn)增刪改查

Django簡(jiǎn)介

django是一個(gè)開(kāi)放源代碼的Python web應(yīng)用框架。采用MTV模式,即模型M,模板T和視圖V。他最初是被開(kāi)發(fā)用于管理勞倫斯出版社集團(tuán)下的一些以新聞內(nèi)容為主的網(wǎng)站,即:CMS(內(nèi)容管理系統(tǒng))軟甲。并于2005年七月在BSD許可證下發(fā)布,并于2008年九月發(fā)布了第一個(gè)正式版本1.0。這套框架是以比利時(shí)的吉普賽爵士吉他手Django Reinhardt來(lái)命名的。

MVC和MTV

MVC并不是一種技術(shù),而是一種開(kāi)發(fā)模式,一種軟件的設(shè)計(jì)典范。將一套業(yè)務(wù)分到不同的層次來(lái)處理,這樣降低了代碼的耦合度,并提高了代碼的可重用性。
MVC開(kāi)始是存在于桌面程序中的,M是指業(yè)務(wù)模型,V是指用戶界面,C則是控制器,使用MVC的目的是將M和V的實(shí)現(xiàn)代碼分離,從而使同一個(gè)程序可以使用不同的表現(xiàn)形式。比如一批統(tǒng)計(jì)數(shù)據(jù)可以分別用柱狀圖、餅圖來(lái)表示。C存在的目的則是確保M和V的同步,一旦M改變,V應(yīng)該同步更新。

Django其實(shí)就是一個(gè)基于MVC構(gòu)造的框架。但是在Django中,控制器接受用戶輸入的部分由框架自行處理,所以 Django 里更關(guān)注的是模型(Model)、模板(Template)和視圖(Views),所以就稱為 MTV模式。MTV模式不過(guò)就是MVC模式的一種衍生體。

對(duì)于模型、視圖、模板我會(huì)在以后的文章中做詳細(xì)介紹,本篇文章的主要目的是認(rèn)識(shí)了解Django,并搭建起Django的開(kāi)發(fā)環(huán)境。

Django安裝

在安裝django之前,請(qǐng)確保已經(jīng)安裝了Python,但是更要注意的是一定要明確使用的django的版本和Python的版本是否兼容,因?yàn)镻ython2在2020年1月就已經(jīng)不在支持,所以建議學(xué)習(xí)與使用Python3,使用Django-1.11.x長(zhǎng)期支持版本。

# 使用如下的命令對(duì)django的指定版本安裝,如果我們想安裝最新版只需要執(zhí)行pip install django命令即可。
PS C:\Users\admin> pip install django==1.11.11
...
# 當(dāng)我們安裝完畢之后,我們?cè)诳刂婆_(tái)輸入python命令進(jìn)入到Python控制臺(tái)
PS C:\Users\admin> python
# 在python的交互界面下引入django模塊,并獲取版本信息,如果以下兩個(gè)命令能夠正確執(zhí)行,則表示我們的django安裝成功了
>>> import django
>>> django.get_version()

使用Django構(gòu)建web工程

使用框架最重要的一點(diǎn)就是構(gòu)建工程,把整體框架搭建完成之后,明確了開(kāi)發(fā)流程,其實(shí)寫(xiě)代碼都是一些簡(jiǎn)單的工作。好了,過(guò)多的廢話不說(shuō),我們撈干的來(lái)。

創(chuàng)建工程

創(chuàng)建一個(gè)我們的工程,這個(gè)工程就是存儲(chǔ)我們以后所有的代碼的地方,一定要挑一個(gè)好地方放哦。

我就將他放到D盤(pán)的根目錄下吧。在windows的控制臺(tái)下執(zhí)行以下的命令,當(dāng)執(zhí)行命令后什么狀態(tài)都沒(méi)有的時(shí)候,你應(yīng)該慶幸,你是對(duì)的,你的工程已經(jīng)成功的創(chuàng)建了。你會(huì)在D盤(pán)下找到剛剛創(chuàng)建的工程的目錄。

PS C:\Users\admin> D:
PS D:\> django-admin startproject djangoProject
PS D:\>

你可以進(jìn)入到工程的目錄下執(zhí)行Tree . /F命令,來(lái)查看這個(gè)目錄的結(jié)構(gòu):

PS D:\> cd djangoProject
PS D:\djangoProject> Tree . /F
文件夾 PATH 列表
卷序列號(hào)為 00000029 EC57:1624
D:\DJANGOPROJECT
│  manage.py
│
└─djangoProject
        settings.py
        urls.py
        wsgi.py
        __init__.py

PS D:\djangoProject>

此時(shí)所創(chuàng)建的所有文件都是這個(gè)工程的配置文件,比如說(shuō),注冊(cè)一個(gè)app,添加靜態(tài)資源,配置數(shù)據(jù)庫(kù)信息等等。

創(chuàng)建應(yīng)用

那么,問(wèn)題來(lái)了,我們?cè)谀睦飳?xiě)我們的代碼啊?我告訴你,在每一個(gè)應(yīng)用中。那應(yīng)用又在哪里呢?我告訴你,自己創(chuàng)建去。那怎么創(chuàng)建呢?來(lái)吧,看代碼:

執(zhí)行以下的創(chuàng)建APP的代碼時(shí),我們一定要進(jìn)入到我們創(chuàng)建的工程目錄下。

PS D:\djangoProject> python manage.py startapp firstApp
PS D:\djangoProject>

shell就是這個(gè)特點(diǎn),成功了,不會(huì)給你任何提示,就是這樣偷偷的帥著。就這樣,我們就帥帥的將名為firstApp的應(yīng)用創(chuàng)建出來(lái)了。此時(shí)工程的目錄結(jié)構(gòu)是這樣的:

PS D:\djangoProject> Tree . /F
文件夾 PATH 列表
卷序列號(hào)為 00000029 EC57:1624
D:\DJANGOPROJECT
│  manage.py
│
├─djangoProject
│  │  settings.py
│  │  urls.py
│  │  wsgi.py
│  │  __init__.py
│  │
│  └─__pycache__
│          settings.cpython-36.pyc
│          __init__.cpython-36.pyc
│
└─firstApp
    │  admin.py
    │  apps.py
    │  models.py
    │  tests.py
    │  views.py
    │  __init__.py
    │
    └─migrations
            __init__.py

此時(shí),你還別高興的太早,因?yàn)楝F(xiàn)在只是像應(yīng)用的樣子,還并不是一個(gè)真正的應(yīng)用,我們需要在工程的配置文件(settings.py)中把這個(gè)應(yīng)用注冊(cè)進(jìn)去。在INSTALLED_APPS配置中把我們的應(yīng)用的名稱添加進(jìn)去,這樣就完美了。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'firstApp',
]

配置數(shù)據(jù)庫(kù)

對(duì)于一個(gè)站點(diǎn)來(lái)說(shuō),后臺(tái)數(shù)據(jù)庫(kù)的支撐那是至關(guān)重要的,沒(méi)有數(shù)據(jù)庫(kù)的數(shù)據(jù),我們拿什么去渲染前臺(tái)的數(shù)據(jù)。所以,配置數(shù)據(jù)庫(kù)是一個(gè)非常神圣的工作,django默認(rèn)的數(shù)據(jù)庫(kù)是sqlite3,但是在實(shí)際開(kāi)發(fā)中幾乎不會(huì)使用他,我們使用MySQL。既然要使用MySQL,那么就要先在你的機(jī)器上安裝MySQL(本文不介紹MySQL的安裝方式)。

配置MySQL我們需要三步:

第一步:安裝MySQL驅(qū)動(dòng),Python3使用的MySQL驅(qū)動(dòng)是pymysql

PS D:\djangoProject>pip install pymysql

第二步:配置settings.py文件

DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'epoch',
        'USER': 'root',
        'PASSWORD': 'admin',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

各個(gè)參數(shù)的介紹:
ENGINE:數(shù)據(jù)庫(kù)驅(qū)動(dòng),標(biāo)志著使用的是什么數(shù)據(jù)庫(kù)。
HOST:數(shù)據(jù)庫(kù)所在主機(jī)的IP
PORT:數(shù)據(jù)庫(kù)所監(jiān)聽(tīng)的端口,MySQL默認(rèn)監(jiān)聽(tīng)3306
USER:數(shù)據(jù)庫(kù)的操作用戶
PASSWORD:數(shù)據(jù)庫(kù)操作用戶的密碼
NAME:所使用的數(shù)據(jù)庫(kù)實(shí)例名稱。(此時(shí)一定要將NAME中配置的數(shù)據(jù)庫(kù)創(chuàng)建出來(lái))

第三步:在settings.py文件同級(jí)目錄下的__init__.py文件中添加以下兩行代碼

import pymysql
pymysql.install_as_MySQLdb()

但是,為了一會(huì)看我們的數(shù)據(jù)庫(kù)是否配置成功,我們添加以下幾行代碼,這樣在我們啟動(dòng)服務(wù)器的時(shí)候,會(huì)在控制臺(tái)中打印出數(shù)據(jù)庫(kù)的版本信息。

# 打開(kāi)數(shù)據(jù)庫(kù)連接
db = pymysql.connect('localhost', 'root', 'admin', 'epoch')
# db = pymysql.connect(host="localhost", user="root", password="admin", db="epoch", port=3306)

# 使用cursor()方法獲取操作游標(biāo)
cursor = db.cursor()

# 使用 executor()方法執(zhí)行SQL語(yǔ)句
cursor.execute("SELECT VERSION()")

# 使用fetchone()獲取一條數(shù)據(jù)庫(kù)
data = cursor.fetchone()

print("Database version : %s " % data)

# 關(guān)閉數(shù)據(jù)庫(kù)連接
db.close()

配置模板目錄

對(duì)于后臺(tái)的一些配置我們都已經(jīng)配置完畢了,那么問(wèn)題又來(lái)了,我們的前臺(tái)頁(yè)面的代碼寫(xiě)在哪里呢?別著急,這就說(shuō)給你聽(tīng)。

在Django中,HTML頁(yè)面這一部分內(nèi)容統(tǒng)一稱為模板,模板的作用就是將后臺(tái)傳遞過(guò)來(lái)的數(shù)據(jù)渲染出來(lái),展示給用戶的。配置模板目錄需要以下兩步:

第一步:創(chuàng)建模板目錄

在我們的工程目錄下創(chuàng)建一個(gè)名為templates的目錄,當(dāng)然了,你可以使用別的名字,但是,約定俗成,都叫做這個(gè)名字了。

PS D:\djangopProject> mkdir templates

第二步:配置模板目錄

將我們?cè)谏弦徊街袆?chuàng)建的目錄配置到settings.py文件中TEMPLATES配置項(xiàng)中的DIRS中,這個(gè)配置是一個(gè)list,我們可以再里邊配置多個(gè)路徑。代碼結(jié)構(gòu)如下:

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',
            ],
        },
    },
]

配置靜態(tài)資源目錄

我們使用的靜態(tài)資源(js,css,圖片,json文件,字體文件等等),又該放在哪里呢?接下來(lái),我們來(lái)配置靜態(tài)資源。配置靜態(tài)資源目錄兩步走:

第一步:創(chuàng)建靜態(tài)資源目錄

在我們的工程目錄下創(chuàng)建一個(gè)名為static的目錄,當(dāng)然了,你可以使用別的名字,但是,約定俗成,都叫做這個(gè)名字了。

PS D:\djangoProject> mkdir static

第二步:配置靜態(tài)資源目錄

打開(kāi)settings.py文件,你會(huì)發(fā)現(xiàn),在文件的最后一行中已經(jīng)為我們配置好了STATIC_URL的目錄為static了,但是為了以后在頁(yè)面中使用動(dòng)態(tài)鏈接(鏈接分為靜態(tài)鏈接和動(dòng)態(tài)鏈接,在后面的使用中我會(huì)做詳細(xì)的介紹)時(shí),我們?cè)谠撆渲玫南逻呍偬砑右恍信渲茫?/p>

STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')]

這個(gè)配置也是一個(gè)list,我們可以配置多個(gè)。

細(xì)心的人會(huì)發(fā)現(xiàn)我在整個(gè)配置過(guò)程中,還沒(méi)有啟動(dòng)過(guò)服務(wù),你如何知道配置的對(duì)不對(duì)啊,確實(shí),我也不知道對(duì)不對(duì),實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)。那我們就啟動(dòng)一下服務(wù)器吧:

PS D:\djangoProject> python manage.py runserver

此時(shí)如果沒(méi)有報(bào)錯(cuò),在瀏覽器中通過(guò)訪問(wèn)http://127.0.0.1:8000可以訪問(wèn)到如下的頁(yè)面內(nèi)容,證明我們啟動(dòng)成功。

It worked!

Congratulations on your first Django-powered page.

Next, start your first app by running python manage.py startapp [app_label].

Youre seeing this message because you have DEBUG = True in your Django settings file and you havent configured any URLs. Get to work!

剛剛的啟動(dòng)頂多也就能看一看我們啟動(dòng)時(shí)沒(méi)有報(bào)錯(cuò),就證明我們寫(xiě)的還沒(méi)有違背django的配置規(guī)范。如何證明可以訪問(wèn)數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)的處理呢,那就得寫(xiě)一些額外的代碼,但是如果寫(xiě)過(guò)多的代碼來(lái)驗(yàn)證,那么就影響了整個(gè)配置過(guò)程的清晰思路。

下面就讓我們用實(shí)踐來(lái)檢驗(yàn)一下我們配置的正確與否。

從頭到尾寫(xiě)套增刪改查

因?yàn)榻^大部分的系統(tǒng)都是有操作用戶的,所以我們以用戶表的增刪改查來(lái)驗(yàn)證配置的正確與否!

我們?cè)谇懊嬲f(shuō)到過(guò),我們所寫(xiě)的業(yè)務(wù)代碼都是在應(yīng)用(APP)中寫(xiě)的,而且在前面我們也創(chuàng)建了一個(gè)名為firstApp的應(yīng)用,我們接下來(lái)就在這里寫(xiě)我們的代碼。

創(chuàng)建模板

我們之前簡(jiǎn)單的提過(guò)HTML頁(yè)面就是就是模板,就是用數(shù)據(jù)渲染后,給人看的東西。因此我們首先要在模板目錄下創(chuàng)建一個(gè)HTML文件,我們就叫做user.html

在該文件中簡(jiǎn)單的添加以下幾行內(nèi)容:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>操作用戶表</title>
</head>
<body>
    <h2>操作用戶表</h2>
    <form method="POST" action="#">
        用戶名:<input type="text" name="username" />
        <br>
        密  碼:<input type="password" name="passwd" />
        <br>
        <button>添加</button>
    </form>
</body>
</html>

但是此時(shí)你啟動(dòng)服務(wù)器還是原來(lái)的那個(gè)歡迎頁(yè)面,我們?nèi)绾文軌蛟谖以L問(wèn)站點(diǎn)的根路徑時(shí),自動(dòng)跳轉(zhuǎn)到我寫(xiě)的頁(yè)面呢?我們就需要?jiǎng)?chuàng)建一個(gè)視圖了。

創(chuàng)建視圖

在我們的firstApp目錄下有一個(gè)views.py文件,這個(gè)文件中就是寫(xiě)我們的視圖的地方。我們?cè)谠撐募刑砑右韵聨仔袃?nèi)容:

def user(request):
    return render(request, 'user.html')

創(chuàng)建完視圖后,你仔細(xì)一想,還是不對(duì)啊,我怎么讓我訪問(wèn)的某一個(gè)url找到指定的視圖呢?這就需要配置url分發(fā)器了。

添加URL

在與settings.py文件的同級(jí)目錄中有一個(gè)urls.py文件,這個(gè)文件就是url分發(fā)器。我們需要在里面的urlpatterns配置項(xiàng)中添加以下內(nèi)容:

from firstApp import views

urlpatterns = [
    url(r'^$', views.user),
    url(r'^admin/', admin.site.urls),
]

此時(shí)我們啟動(dòng)服務(wù)器,就可以看到我們剛剛創(chuàng)建的HTML頁(yè)面了。

添加模型

接下來(lái),我們應(yīng)該定義一個(gè)模型(model),一個(gè)模型就是一個(gè)類,這個(gè)類就封裝了一張數(shù)據(jù)庫(kù)表而已,用于做數(shù)據(jù)庫(kù)的初始化以及表的增刪改查。
在我們創(chuàng)建的firstApp目錄下有一個(gè)models.py文件,我們就在這個(gè)文件中定義模型,定義模型需要引入django.db中的models(應(yīng)用中默認(rèn)是已經(jīng)引入的),模型類要繼承models.Model類。我們以創(chuàng)建一個(gè)簡(jiǎn)單的用戶模型為例,代碼如下:

from django.db import models

# Create your models here.
class User(models.Model):
    username = models.CharField(max_length=20)
    passwd = models.CharField(max_length=16)

你先不需要關(guān)注這些代碼是什么意思,只需要知道,這個(gè)模型有兩個(gè)字段,與數(shù)據(jù)庫(kù)中的某一張表是對(duì)應(yīng)的關(guān)系就好,當(dāng)你去訪問(wèn)數(shù)據(jù)庫(kù)的時(shí)候,你會(huì)發(fā)現(xiàn)創(chuàng)建了好多張表,你根本就沒(méi)有找到將User的這張表,為什么呢?因?yàn)槟J(rèn)情況下,django生成數(shù)據(jù)表的格式是appName_modelNmae.我們?cè)诤笃诘膬?nèi)容會(huì)做詳細(xì)的介紹。

模型遷移

我們把模型定義完了還不夠,我們需要將這個(gè)模型在數(shù)據(jù)庫(kù)中生成一張表,那我們?cè)撊绾巫瞿??分以下兩步走?/p>

第一步:生成遷移文件

我們的工程目錄下執(zhí)行以下命令:

PS D:\djangoProject> python manage.py makemigrations
Database version : 5.5.53
Migrations for 'firstApp':
  firstApp\migrations\0001_initial.py
    - Create model User
PS D:\djangoProject>

第二步:執(zhí)行遷移

在執(zhí)行完上一步后,只是生成了一個(gè)遷移文件,此時(shí)還沒(méi)有在數(shù)據(jù)庫(kù)中創(chuàng)建表,我們需要執(zhí)行以下命令來(lái)生成數(shù)據(jù)表:

PS D:\djangoProject> python manage.py migrate
Database version : 5.5.53
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, firstApp, sessions
Running migrations:
  Applying firstApp.0001_initial... OK
PS D:\djangoProject>

對(duì)用戶表進(jìn)行操作

前面的所有步驟都執(zhí)行完成后,我們的整體框架算是完整了,接下來(lái),我們進(jìn)行一些數(shù)據(jù)的增刪改查吧。

添加用戶

我們?cè)谇拔闹幸呀?jīng)添加了一個(gè)類似于登錄頁(yè)面的一個(gè)模板,我們就用這個(gè)頁(yè)面中的兩個(gè)字段進(jìn)行添加操作。

首先我們?cè)谠撃0逯械膄orm表單中的action屬性中,添加一個(gè)url,但是這時(shí)候我們還沒(méi)有url,所以,這就需要我們隨心所欲的設(shè)計(jì)了,看我的代碼吧:

user.html模板代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>操作用戶表</title>
</head>
<body>
    <h2>操作用戶表</h2>
    <form method="POST" action="add/">
        {% csrf_token %}
        用戶名:<input type="text" name="username" />
        <br>
        密  碼:<input type="password" name="passwd" />
        <br>
        <button>添加</button>
    </form>
</body>
</html>

urls.py文件中的urlpatterns中添加url

urlpatterns = [
    url(r'^$', views.user),
    url(r'^add/$', views.add),
    url(r'^admin/', admin.site.urls),
]

此時(shí)views下的add方法還不存在,我們需要在firstApp/views.py文件中添加add方法。

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.
def user(request):
    return render(request, 'user.html')

def add(request):
    username = request.POST.get('username')
    passwd = request.POST.get('passwd')
    print(username,passwd)
    return HttpResponse('添加成功!')
    

運(yùn)行服務(wù)器,在表單中輸入內(nèi)容,點(diǎn)擊添加,如果在頁(yè)面中顯示添加成功并在后臺(tái)打印出你輸入的內(nèi)容,即表示該步驟是正確的。

PS D:\djangoProject> python manage.py runserver
Database version : 5.5.53
Database version : 5.5.53
Performing system checks...

System check identified no issues (0 silenced).
April 03, 2018 - 08:45:26
Django version 1.11.10, using settings 'djangoProject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
Database version : 5.5.53
Performing system checks...
admin ASDF
[03/Apr/2018 08:48:34] "POST /add/ HTTP/1.1" 200 15

最后一步,我們需要對(duì)模型進(jìn)行操作了,這一步需要在views.py文件中引入當(dāng)前目錄下的models中的User類,將接收到的前臺(tái)的數(shù)據(jù)添加到User對(duì)象中,然后執(zhí)行save()添加操作。代碼如下:

from django.shortcuts import render
from django.http import HttpResponse
from . models import User

# Create your views here.
def user(request):
    return render(request, 'user.html')

def add(request):
    name = request.POST.get('username')
    password = request.POST.get('passwd')
    user = User()
    user.username = name
    user.passwd = password
    user.save()
    return HttpResponse('添加成功!')
    

啟動(dòng)服務(wù)器,重新執(zhí)行添加操作,如果成功了,去查看數(shù)據(jù)庫(kù),你會(huì)發(fā)現(xiàn)表中多了一條你剛剛插入的數(shù)據(jù)。

查詢所有用戶

有了上一步添加操作的范本,我們就可以模仿著做一個(gè)查詢的操作了。

首先是根據(jù)我們的功能來(lái)自己設(shè)計(jì)一個(gè)url,此時(shí)我們的urls.py中的urlpatterns的配置是這樣的:

from django.conf.urls import url
from django.contrib import admin
from firstApp import views

urlpatterns = [
    url(r'^$', views.user),
    url(r'^add/$', views.add),
    url(r'^getAllUser/$', views.getAllUser),
    url(r'^admin/', admin.site.urls),
]

但是我們url所指向的views下的getAllUser視圖方法還不存在,需要我們?nèi)?chuàng)建該方法并在該視圖方法中引入當(dāng)前文件夾下的models類,再實(shí)現(xiàn)查詢的業(yè)務(wù)邏輯。代碼如下:

def getAllUser(request):
    userList = User.objects.all()
    return render(request, 'userList.html',{'users':userList})

你會(huì)發(fā)現(xiàn)我們的userList.html還沒(méi)有創(chuàng)建,那就在模板目錄下創(chuàng)建一個(gè)吧,并在文件中添加以下代碼,我們將用戶的id和用戶名顯示在前臺(tái)。看代碼吧:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>用戶列表</title>
</head>
<body>
    <ul>
        {% for user in users %}
        <li>{{user.pk}}----{{user.username}}</li>
        {% endfor %}
    </ul>
</body>
</html>

此時(shí),你又會(huì)有一個(gè)疑惑,我們的模型中沒(méi)有pk這個(gè)字段啊,他是哪里出來(lái)的?。窟@個(gè)是id,是模型在創(chuàng)建的時(shí)候自動(dòng)生成的一個(gè)字段。在模型篇中,我們會(huì)做相應(yīng)的講解。

好了,我們啟動(dòng)服務(wù)器,訪問(wèn)一下http://127.0.0.1:8000/getAllUser這個(gè)url吧。如果你在頁(yè)面中看到你在數(shù)據(jù)庫(kù)中插入的所有的用戶信息,證明你可以慶祝一下了。

細(xì)心的人可能會(huì)發(fā)現(xiàn),我在做插入和查詢的時(shí)候,我的操作順序是不同的,我不是說(shuō)查詢就要這個(gè)順序,插入就是這個(gè)順序,這個(gè)還是要根據(jù)自己的思路來(lái)的。在現(xiàn)實(shí)的開(kāi)發(fā)中,一般都是從前往后想,從后往前做。

聲明一下:在接下來(lái)的修改和刪除,為了簡(jiǎn)單我就不寫(xiě)模板頁(yè)面了,但是在現(xiàn)實(shí)的工作中,這些操作一定是從前臺(tái)來(lái)操作的。

修改用戶

修改用戶和插入用戶的方法是相同的,都是從前臺(tái)將數(shù)據(jù)傳到后臺(tái),再到后臺(tái)將數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行修改

定義url,在urls.py文件中的urlpatterns配置中添加以下的配置,想用什么url自己隨心所欲嘍。

url(r'^updateUser/$', views.updateUser),

定義視圖并完成數(shù)據(jù)的處理

def updateUser(request):
    # 查詢出用戶表中的第一個(gè)用戶
    upUser = User.objects.first()
    # 將該用戶密碼進(jìn)行重新賦值
    upUser.passwd = '123456'
    # 將修改后的對(duì)象再重新save到數(shù)據(jù)庫(kù)中
    upUser.save()
    # 如果沒(méi)有錯(cuò)誤返回添加成功的字樣
    return HttpResponse('修改成功')

現(xiàn)在我們?cè)L問(wèn)http://127.0.0.1:8000/updateUser的時(shí)候就可以將第一個(gè)用戶的密碼修改為123456了,如果我們創(chuàng)建了模板,只需要將表單中修改的數(shù)據(jù)傳到后臺(tái)處理一下就可以了。

刪除用戶

刪除用戶和修改用戶的操作步驟是一樣的。

定義url,在urls.py文件中的urlpatterns配置中添加以下的配置。

url(r'^deleteUser/$', views.deleteUser),

定義視圖并完成數(shù)據(jù)的處理

def deleteUser(request):
    user = User.objects.get(id='2')
    user.delete()
    return HttpResponse('刪除成功')

現(xiàn)在我們?cè)L問(wèn)http://127.0.0.1:8000/deleteUser的時(shí)候就可以將id為2的用戶刪除掉了。

企業(yè)級(jí)改造

到這里,我們我Django框架就算搭建和驗(yàn)證完成了,同時(shí)也了解了基本的開(kāi)發(fā)流程,但是企業(yè)開(kāi)發(fā)過(guò)程中會(huì)在這個(gè)基礎(chǔ)上還是會(huì)有很多擴(kuò)展和改變的。下面我們就對(duì)他進(jìn)行一下改造。

urls改造

我們現(xiàn)在是將所有的url都寫(xiě)在了工程的增提配置中的urls.py文件中了,這樣做其實(shí)是不合理的,有以下幾點(diǎn)原因:

  • 實(shí)際的開(kāi)發(fā)中可能會(huì)有幾十甚至幾百個(gè)url,如果都寫(xiě)在一個(gè)文件中對(duì)于維護(hù)來(lái)說(shuō),簡(jiǎn)直不堪設(shè)想;
  • 實(shí)際的開(kāi)發(fā)中是多個(gè)人同時(shí)進(jìn)行的,很難保證你們的url沒(méi)有沖突(雖然概率很?。?;
  • 對(duì)于團(tuán)隊(duì)開(kāi)發(fā)的版本控制系統(tǒng),如果都寫(xiě)在一個(gè)文件中,大家都來(lái)修改避免不了會(huì)有沖突。

因此,我們可以使用一下的方式進(jìn)行改造:

1、在app目錄下創(chuàng)建屬于app自己的urls.py文件

進(jìn)入到你所開(kāi)發(fā)的app下,創(chuàng)建一個(gè)urls.py文件

我的工程名叫djangoProject,放在了D盤(pán)的根目錄下

為了展示方便,我使用命令行操作的,你完全可以使用圖形界面,我只是閑截圖上傳太麻煩了,而且這樣看著也更加清晰。

PS C:\Users\admin> D:
PS D:\> cd djangoProject
PS D:\djangoProject> cd firstApp
PS D:\djangoProject\firstApp> new-item urls.py


    目錄: D:\djangoProject\firstApp


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        2018/4/13     10:53              0 urls.py


PS D:\djangoProject\firstApp>

2、將app的urls.py文件引入到工程的全局urls.py文件中

工程的全局配置文件都在工程目錄下的與工程名同名的目錄下

在該文件中引入from django.conf.urls import include ,并在urlpatterns配置中添加url(r'^', include('firstApp.urls', namespace='first_app'))配置,修改后的內(nèi)容如下:

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include('firstApp.urls', namespace='first_app'))
]

3、在firstApp的urls.py文件中引入相應(yīng)的模塊和添加該app中隊(duì)醫(yī)的所有url

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.user),
    url(r'^add/$', views.add, name='addUser'),
    url(r'^getAllUser/$', views.getAllUser, name='getAllUser'),
    url(r'^updateUser/$', views.updateUser, name='updateUser'),
    url(r'^deleteUser/$', views.deleteUser, name='deleteUser'),
]

namespace和name的配置是用來(lái)配置動(dòng)態(tài)url的。在以后的視圖篇再做詳細(xì)的分享。

此時(shí)你可以啟動(dòng)服務(wù)了,如果能夠正常訪問(wèn),證明的的改造已經(jīng)成功了。

業(yè)務(wù)處理改造

在前文的內(nèi)容中,我們做的增刪改查都是在視圖層進(jìn)行對(duì)模型的直接操作,如果說(shuō)業(yè)務(wù)比較復(fù)雜內(nèi)容比較多的時(shí)候,這個(gè)文件會(huì)比較大,代碼找起來(lái)也是很費(fèi)勁。所以我們要對(duì)其進(jìn)行改造。

1、我們?cè)趂irstApp下新建一個(gè)service.py文件。

PS D:\djangoProject> cd firstApp
PS D:\djangoProject\firstApp> new-item service.py


    目錄: D:\djangoProject\firstApp


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        2018/4/13     11:21              0 service.py


PS D:\djangoProject\firstApp>

2、在該文件中引入當(dāng)前目錄下的models模塊中的User模型,并添加處理代碼。

我們以改造查詢所有用戶的方法來(lái)進(jìn)行演示,其他的可以自行改造哦

代碼如下:

from . models import User


class FirstAppService:

    def getAllUserService(self):
        return User.objects.all()

當(dāng)然也可以不去創(chuàng)建類,直接定義方法,但是這樣處理的話,我們?nèi)菀壮霈F(xiàn)和視圖中的方法調(diào)用沖突。還有就是我們需要記住方法名,如果創(chuàng)建類的話,我們通過(guò)點(diǎn)方法提示就可以一目了然了。具體喜歡哪一種根據(jù)個(gè)人喜好了。

3、在視圖中引入該service模塊下的FirstAppService類,通過(guò)類來(lái)調(diào)用方法。

代碼如下:

from . service import FirstAppService


def getAllUser(request):
    # userList = User.objects.all()
    userList = FirstAppService.getAllUserService()
    return render(request, 'userList.html',{'users':userList})

好了,業(yè)務(wù)處理也改造完了,可以啟動(dòng)訪問(wèn)一下試一試了。

小結(jié)

到這里,我們我Django框架就算搭建和驗(yàn)證完成了,同時(shí)也了解了基本的開(kāi)發(fā)流程,但是開(kāi)發(fā)過(guò)程中會(huì)在這個(gè)基礎(chǔ)上還是會(huì)有很多擴(kuò)展和改變的,這些內(nèi)容我會(huì)在以后的分享中不斷的完善。

好了,本期的內(nèi)容就到這里。我會(huì)不斷的去更新和修改我的文檔。我們下一期的內(nèi)容是“Django模板層的擴(kuò)展“,如果您看到我的文章,希望您給出一些評(píng)價(jià)和指點(diǎn),我會(huì)進(jìn)行修改學(xué)習(xí),更希望看到這篇文章的你在學(xué)習(xí)與工作的路上一天比一天優(yōu)秀。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容