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