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)秀。