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

Django簡(jiǎn)介

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

MVC和MTV

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

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

對(duì)于模型、視圖渗饮、模板我會(huì)在以后的文章中做詳細(xì)介紹但汞,本篇文章的主要目的是認(rèn)識(shí)了解Django,并搭建起Django的開發(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)建工程满力,把整體框架搭建完成之后,明確了開發(fā)流程轻纪,其實(shí)寫代碼都是一些簡(jiǎn)單的工作油额。好了,過多的廢話不說刻帚,我們撈干的來潦嘶。

創(chuàng)建工程

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

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

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

你可以進(jìn)入到工程的目錄下執(zhí)行Tree . /F命令,來查看這個(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è)工程的配置文件冯勉,比如說澈蚌,注冊(cè)一個(gè)app,添加靜態(tài)資源灼狰,配置數(shù)據(jù)庫信息等等宛瞄。

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

那么,問題來了交胚,我們?cè)谀睦飳懳覀兊拇a胺莺埂?我告訴你蝴簇,在每一個(gè)應(yīng)用中杯活。那應(yīng)用又在哪里呢?我告訴你熬词,自己創(chuàng)建去旁钧。那怎么創(chuàng)建呢?來吧互拾,看代碼:

執(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)建出來了车遂。此時(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ù)庫

對(duì)于一個(gè)站點(diǎn)來說闸氮,后臺(tái)數(shù)據(jù)庫的支撐那是至關(guān)重要的,沒有數(shù)據(jù)庫的數(shù)據(jù)教沾,我們拿什么去渲染前臺(tái)的數(shù)據(jù)蒲跨。所以,配置數(shù)據(jù)庫是一個(gè)非常神圣的工作授翻,django默認(rèn)的數(shù)據(jù)庫是sqlite3或悲,但是在實(shí)際開發(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ù)庫驅(qū)動(dòng)男公,標(biāo)志著使用的是什么數(shù)據(jù)庫。
HOST:數(shù)據(jù)庫所在主機(jī)的IP
PORT:數(shù)據(jù)庫所監(jiān)聽的端口合陵,MySQL默認(rèn)監(jiān)聽3306
USER:數(shù)據(jù)庫的操作用戶
PASSWORD:數(shù)據(jù)庫操作用戶的密碼
NAME:所使用的數(shù)據(jù)庫實(shí)例名稱枢赔。(此時(shí)一定要將NAME中配置的數(shù)據(jù)庫創(chuàng)建出來)

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

import pymysql
pymysql.install_as_MySQLdb()

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

# 打開數(shù)據(jù)庫連接
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語句
cursor.execute("SELECT VERSION()")

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

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

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

配置模板目錄

對(duì)于后臺(tái)的一些配置我們都已經(jīng)配置完畢了执隧,那么問題又來了,我們的前臺(tái)頁面的代碼寫在哪里呢户侥?別著急镀琉,這就說給你聽。

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

第一步:創(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文件,字體文件等等)信认,又該放在哪里呢材义?接下來,我們來配置靜態(tài)資源嫁赏。配置靜態(tài)資源目錄兩步走:

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

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

PS D:\djangoProject> mkdir static

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

打開settings.py文件华烟,你會(huì)發(fā)現(xiàn),在文件的最后一行中已經(jīng)為我們配置好了STATIC_URL的目錄為static了持灰,但是為了以后在頁面中使用動(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è)配置過程中,還沒有啟動(dòng)過服務(wù)妥泉,你如何知道配置的對(duì)不對(duì)啊椭微,確實(shí),我也不知道對(duì)不對(duì)盲链,實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)蝇率。那我們就啟動(dòng)一下服務(wù)器吧:

PS D:\djangoProject> python manage.py runserver

此時(shí)如果沒有報(bào)錯(cuò),在瀏覽器中通過訪問http://127.0.0.1:8000可以訪問到如下的頁面內(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í)沒有報(bào)錯(cuò),就證明我們寫的還沒有違背django的配置規(guī)范侧漓。如何證明可以訪問數(shù)據(jù)庫進(jìn)行數(shù)據(jù)的處理呢锅尘,那就得寫一些額外的代碼,但是如果寫過多的代碼來驗(yàn)證布蔗,那么就影響了整個(gè)配置過程的清晰思路藤违。

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

從頭到尾寫套增刪改查

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

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

創(chuàng)建模板

我們之前簡(jiǎn)單的提過HTML頁面就是就是模板隔盛,就是用數(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ù)器還是原來的那個(gè)歡迎頁面腊脱,我們?nèi)绾文軌蛟谖以L問站點(diǎn)的根路徑時(shí),自動(dòng)跳轉(zhuǎn)到我寫的頁面呢龙亲?我們就需要?jiǎng)?chuàng)建一個(gè)視圖了陕凹。

創(chuàng)建視圖

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

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

創(chuàng)建完視圖后杜耙,你仔細(xì)一想,還是不對(duì)啊拂盯,我怎么讓我訪問的某一個(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īng)該定義一個(gè)模型(model),一個(gè)模型就是一個(gè)類嚎花,這個(gè)類就封裝了一張數(shù)據(jù)庫表而已,用于做數(shù)據(jù)庫的初始化以及表的增刪改查呀洲。
在我們創(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ù)庫中的某一張表是對(duì)應(yīng)的關(guān)系就好贰您,當(dāng)你去訪問數(shù)據(jù)庫的時(shí)候坏平,你會(huì)發(fā)現(xiàn)創(chuàng)建了好多張表,你根本就沒有找到將User的這張表锦亦,為什么呢舶替?因?yàn)槟J(rèn)情況下,django生成數(shù)據(jù)表的格式是appName_modelNmae.我們?cè)诤笃诘膬?nèi)容會(huì)做詳細(xì)的介紹杠园。

模型遷移

我們把模型定義完了還不夠顾瞪,我們需要將這個(gè)模型在數(shù)據(jù)庫中生成一張表,那我們?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í)還沒有在數(shù)據(jù)庫中創(chuàng)建表,我們需要執(zhí)行以下命令來生成數(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í)行完成后钉跷,我們的整體框架算是完整了弥鹦,接下來,我們進(jìn)行一些數(shù)據(jù)的增刪改查吧爷辙。

添加用戶

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

首先我們?cè)谠撃0逯械膄orm表單中的action屬性中膝晾,添加一個(gè)url栓始,但是這時(shí)候我們還沒有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)擊添加领跛,如果在頁面中顯示添加成功并在后臺(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ù)庫兜粘,你會(huì)發(fā)現(xiàn)表中多了一條你剛剛插入的數(shù)據(jù)。

查詢所有用戶

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

首先是根據(jù)我們的功能來自己設(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還沒有創(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è)疑惑黎休,我們的模型中沒有pk這個(gè)字段啊浓领,他是哪里出來的啊势腮?這個(gè)是id联贩,是模型在創(chuàng)建的時(shí)候自動(dòng)生成的一個(gè)字段。在模型篇中捎拯,我們會(huì)做相應(yīng)的講解泪幌。

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

細(xì)心的人可能會(huì)發(fā)現(xiàn)没隘,我在做插入和查詢的時(shí)候,我的操作順序是不同的禁荸,我不是說查詢就要這個(gè)順序右蒲,插入就是這個(gè)順序,這個(gè)還是要根據(jù)自己的思路來的赶熟。在現(xiàn)實(shí)的開發(fā)中瑰妄,一般都是從前往后想,從后往前做映砖。

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

修改用戶

修改用戶和插入用戶的方法是相同的,都是從前臺(tái)將數(shù)據(jù)傳到后臺(tái)瓜饥,再到后臺(tái)將數(shù)據(jù)庫中的數(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ù)庫中
    upUser.save()
    # 如果沒有錯(cuò)誤返回添加成功的字樣
    return HttpResponse('修改成功')

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

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

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

urls改造

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

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

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

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

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

我的工程名叫djangoProject,放在了D盤的根目錄下

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

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的配置是用來配置動(dòng)態(tài)url的翻伺。在以后的視圖篇再做詳細(xì)的分享。

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

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

在前文的內(nèi)容中峦树,我們做的增刪改查都是在視圖層進(jìn)行對(duì)模型的直接操作辣辫,如果說業(yè)務(wù)比較復(fù)雜內(nèi)容比較多的時(shí)候旦事,這個(gè)文件會(huì)比較大,代碼找起來也是很費(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模型,并添加處理代碼畴嘶。

我們以改造查詢所有用戶的方法來進(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)建類的話,我們通過點(diǎn)方法提示就可以一目了然了条摸。具體喜歡哪一種根據(jù)個(gè)人喜好了悦污。

3、在視圖中引入該service模塊下的FirstAppService類钉蒲,通過類來調(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)訪問一下試一試了踏枣。

小結(jié)

到這里,我們我Django框架就算搭建和驗(yàn)證完成了钙蒙,同時(shí)也了解了基本的開發(fā)流程茵瀑,但是開發(fā)過程中會(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)系作者
  • 序言:七十年代末昌阿,一起剝皮案震驚了整個(gè)濱河市饥脑,隨后出現(xiàn)的幾起案子恳邀,更是在濱河造成了極大的恐慌,老刑警劉巖灶轰,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谣沸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡笋颤,警方通過查閱死者的電腦和手機(jī)乳附,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伴澄,“玉大人赋除,你說我怎么就攤上這事》橇瑁” “怎么了举农?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)敞嗡。 經(jīng)常有香客問我颁糟,道長(zhǎng),這世上最難降的妖魔是什么喉悴? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任棱貌,我火速辦了婚禮,結(jié)果婚禮上箕肃,老公的妹妹穿的比我還像新娘婚脱。我一直安慰自己,他們只是感情好勺像,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布障贸。 她就那樣靜靜地躺著,像睡著了一般吟宦。 火紅的嫁衣襯著肌膚如雪惹想。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天督函,我揣著相機(jī)與錄音嘀粱,去河邊找鬼。 笑死辰狡,一個(gè)胖子當(dāng)著我的面吹牛锋叨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宛篇,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼娃磺,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了叫倍?” 一聲冷哼從身側(cè)響起偷卧,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤豺瘤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后听诸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坐求,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年晌梨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桥嗤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡仔蝌,死狀恐怖泛领,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情敛惊,我是刑警寧澤渊鞋,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站瞧挤,受9級(jí)特大地震影響篓像,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜皿伺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盒粮。 院中可真熱鬧鸵鸥,春花似錦、人聲如沸丹皱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摊崭。三九已至讼油,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呢簸,已是汗流浹背矮台。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留根时,地道東北人瘦赫。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蛤迎,于是被迫代替她去往敵國(guó)和親确虱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容