一、Django基礎(chǔ)
Django 是用Python開發(fā)的一個免費開源的Web框架,可以用于快速搭建高性能,優(yōu)雅的網(wǎng)站!
Django的特點:
強大的數(shù)據(jù)庫功能:擁有強大的數(shù)據(jù)庫操作接口(QuerySet API),也能執(zhí)行原生SQL
自帶強大后臺:網(wǎng)站擁有一個強大的后臺,輕松管理內(nèi)容
優(yōu)雅的網(wǎng)址:用正則匹配網(wǎng)址,傳遞到對應(yīng)函數(shù),隨意定義。
模版系統(tǒng):易擴展的模版系統(tǒng),設(shè)計簡易,代碼,樣式 分開設(shè)計,更容易管理。
緩存系統(tǒng):與memcached,redis等緩存系統(tǒng)聯(lián)用,更出色的表現(xiàn),更快的加載速度。
國際化:完全支持多國語言應(yīng)用,允許定義翻譯的字符,輕松翻譯成不同國際的語言。
Django目錄結(jié)構(gòu):
urls.py:網(wǎng)址入口,關(guān)聯(lián)到對應(yīng)的Views.py中的一個函數(shù),訪問網(wǎng)址對應(yīng)的函數(shù)。
views.py:處理用戶發(fā)出的請求,從urls.py中對應(yīng)過來,通過渲染templates中的網(wǎng)頁可以將顯示內(nèi)容,比如登陸后的用戶名,數(shù)據(jù),輸出到網(wǎng)頁。
models.py:與數(shù)據(jù)庫操作相關(guān),存入或讀取數(shù)據(jù)時用到這個
templates文件夾:views.py中的函數(shù)渲染templates中的HTML模版,得到動態(tài)內(nèi)容網(wǎng)頁,可以用緩存來提高速度。
admin.py:后臺,可以用很少量的代碼就擁有一個強大的后臺。
settings.py:Django的全局設(shè)置,配置文件,比如DEBUG的開關(guān),靜態(tài)文件的位置設(shè)置等。
二、Django安裝
1、用pip來安裝
(1)安裝pip:yum install python-pip 或者https://bootstrap.pypa.io/get-pip.py 下載get-pip然后運行python get-pip.py就可以安裝pip了;也可以下載pip源碼包,運行python setup.py install 進行安裝。
(2)利用pip安裝Django
pip install Django 或者 pip install Django==2.0.4
升級pip可以用:pip install --upgrade pip
2、下載源碼安裝
linux and MAC:
下載源碼包:https://www.djangoproject.com/m/releases/2.0/Django-2.0.4.tar.gz
tar -xvf django-2.0.4.tar.gz
cd django-2.0.4
python setup.py install
3、linux用自帶源進行安裝
ubuntu:
sudo apt-get install python-django -y
fedora:
yum install python-django -y
檢查是否安裝成功:看到版本號則安裝成功!
>> import django
>> django.VERSION
(2, 0, 4, 'final', 0)
>> django.get_version()
'2.0.4'

三、Django基本命令
1.創(chuàng)建一個django項目
直接在終端輸入:
django-admin startproject Hello
然后進入mysite這個文件目錄,在終端輸入:
cd Hello/
查看目錄有什么內(nèi)容,在終端輸入: ls
然后我們繼續(xù)進入mysite這個目錄在通過ls查看有什么內(nèi)容。

看一下它的結(jié)構(gòu)
Hello/
├── manage.py
└── Hello
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
Hello/ 根目錄只是項目的容器,它的名字與Django無關(guān),可以將它重命名為任何任何名字
manage.py:一個命令行實用程序,可讓你以各種方式與Django項目進行交互
Hello:是項目的實際python包,它的名字是你需要用來導(dǎo)入任何內(nèi)容的python包名
init.py:一個空文件,告訴python這個目錄應(yīng)該被視為一個python包
settings.py:這是Django項目的設(shè)置與配置,Django設(shè)置會告訴你有關(guān)設(shè)置如何工作的所有信息
urls.py:這是Django項目的URL聲明
wsqi.py:WSGI兼容的Web服務(wù)器為你的項目提供服務(wù)的入口點
四、啟動服務(wù)器
通過上面的操作我們已經(jīng)創(chuàng)建好一個django項目了,我們回到最外層的mysite/這個目錄,然后在終端輸入:python manage.py runserver 啟動服務(wù)器,成功后會出現(xiàn)下面的樣子。

然后我們在瀏覽器訪問http://127.0.0.1:8000/,會出現(xiàn)下面這個樣子。

到現(xiàn)在為止我們已經(jīng)成功新建了一個新的django項目,并且把它運行了起來。
創(chuàng)建一個應(yīng)用
值得一提的是項目和應(yīng)用的區(qū)別:一個應(yīng)用是 Web 程序中的一個功能,比如博客應(yīng)用,投票應(yīng)用.一個項目是許多個基本應(yīng)用的集合
直接在終端輸入命令: python manage.py startapp staffadmin
成功創(chuàng)建staffadmin這個應(yīng)用我們可以進入這個文件目錄看下都有哪些文件。

admin.py:這個是配置管理后臺數(shù)據(jù).
models.py :這里面的每一個類,可以比喻成數(shù)據(jù)庫的每一個表.
views.py :主要用作前后端交互。
urls.py:用作配置路由。
創(chuàng)建一個視圖
打開staffadmin/views.py這個文件,寫下如下代碼

然后我們在staffadmin目錄下新建一個urls.py,寫下如下代碼

同時還要配置一下Hello/urls.py,寫下如下代碼

然后我們通過瀏覽器訪問http://127.0.0.1:8000/staffadmin/index
如果成功訪問,會在瀏覽器看到"This is my first application"。

我們也可以在子文件夾Hello/下創(chuàng)建一個視圖view.py

然后在Hello/下的urls.py里添加

然后訪問127.0.0.1:8080,就可以看到hello world!了

也可以修改以下規(guī)則

然后訪問127.0.0.1/hello,效果一樣

五、配置數(shù)據(jù)庫
我們打開Hello/Hello/settings.py這個文件。

我們可以看到熟悉的databases,默認(rèn)配置的數(shù)據(jù)庫是 SQLite,如果你想使用其它的數(shù)據(jù)庫,需要在文件中的 DATABASES 'default' 改變適當(dāng)?shù)闹怠?br> 比如我們想要連接mysql:

我們還可以通過這樣修改時區(qū)和中文設(shè)置。

我們還可以看到INSTALLED_APPS有這些應(yīng)用

在django中一些應(yīng)用程序使用至少一個數(shù)據(jù)庫表,因此我們需要在數(shù)據(jù)庫中創(chuàng)建表,然后才能使用它們。
直接在終端輸入命令:python manage.py migrate

創(chuàng)建模型

上面兩個類相當(dāng)于創(chuàng)建了兩個表,類名代表表名,變量代表列名
激活模型
可以在INSTALLED_APPS里面加上'staffadmin'或者'staffadmin.apps.staffadminConfig'

經(jīng)過上面的操作我們已經(jīng)注冊staffadmin這個應(yīng)用了,因為我們之前對模型做了一些改變,并且你想要把這些改變保存為 migration。
直接在終端輸入命令:python manage.py makemigrations staffadmin

如果我們想知道這個命令到底做了些什么,可以通過在終端直接輸入命令: python manage.py sqlmigrate staffadmin 0001

熟悉數(shù)據(jù)庫的同學(xué)一看就明白,這不就是創(chuàng)建數(shù)據(jù)庫表的操作命令嗎?沒錯的確如此。
然后我們還差最后一步就可以把數(shù)據(jù)庫創(chuàng)建起來,
直接在終端輸入命令: python manage.py migrate staffadmin

直到這一步,我們的數(shù)據(jù)庫已經(jīng)建好?,F(xiàn)在我還要提醒的是,migrate 命令會執(zhí)行所有還沒應(yīng)用的遷移,
并會在數(shù)據(jù)庫中執(zhí)行相應(yīng)的代碼來同步你的修改.遷移是一個非常強大且有用的工具,可以讓你在開發(fā)項目的任何時候,
不需要對數(shù)據(jù)庫進行刪除增加等操作就完成修改,在升級數(shù)據(jù)庫信息時也不會造成丟失.現(xiàn)在只需要記住以下這三個步驟:
如果修改了模型(在 models.py 文件中).
運行 python manage.py makemigrations來為這些修改創(chuàng)建遷移.
運行 python manage.py migrate 來應(yīng)用這些改變到數(shù)據(jù)庫.

操作數(shù)據(jù)庫(models)
操作數(shù)據(jù)庫無非就是增刪改查。
首先我們在終端輸入命令python manage.py shell,然后先把我們的數(shù)據(jù)庫表引進來。
from staff.modles import Department
增
models.Department.objects.create(department_name='市場部') 增加一條數(shù)據(jù),可以接受字典類型數(shù)據(jù) **kwargs
obj = models.Department(department_name='市場部')
obj.save()
查
models.Department.objects.get(id=1) # 獲取id=1的單條數(shù)據(jù),不存在則報錯(不建議)
models.Department.objects.all() # 獲取全部數(shù)據(jù)
models.Department.objects.filter(department_name='市場部') # 獲取department_name='市場部'的數(shù)據(jù)# models.Department.objects.exclude(department_name='市場部') # 獲取除了department_name='市場部'的數(shù)據(jù)
刪
models.Department.objects.filter(department_name='市場部').delete() # 刪除department_name='市場部'的數(shù)據(jù)
改
models.Department.objects.filter(department_name='市場部').update(department_name='運營部') # 將department_name="市場部"改成"運營部",均支持 **kwargs
obj = models.Department.objects.get(id=1)
obj.department_name= '運營部'
obj.save() # 保存數(shù)據(jù)
當(dāng)有一對多,多對一,或者多對多的關(guān)系的時候,先把相關(guān)的對象查詢出來


在這里我提一下ForeignKey,ManyToManyField與OneToOneField分別是Model中定義多對一,多對多,一對一關(guān)系。
在本例的教程中,我們可以知道一個員工只有一個部門,一個部門可以有多個員工,所以用了ForeignKeyField
admin站點的使用
首先我們先創(chuàng)建一個超級用戶的賬號
直接在終端輸入命令:python manage.py createsupperuser,然后根據(jù)提示輸入相關(guān)內(nèi)容即可。

此時我們可以通過瀏覽器訪問http://127.0.0.1:8000/admin/,我們會看到下面的畫面。

此時我們發(fā)現(xiàn)我們寫的models沒有顯示出來,是因為沒有在admin上面注冊。
所以我們打開Hello/staffadmin/admin.py這個文件
然后我們把models引進來

保存代碼,然后刷新瀏覽器我們發(fā)現(xiàn)多了一個staffadmin的管理組

然后看看其內(nèi)容


這是我們剛才添加的信息
使用mysql數(shù)據(jù)庫
與數(shù)據(jù)庫的交互:
把數(shù)據(jù)存取邏輯、業(yè)務(wù)邏輯和表現(xiàn)邏輯組合在一起的概念有時被稱為軟件架構(gòu)的 Model-View-Controller (MVC)模式。在這個模式中, Model 代表數(shù)據(jù)存取層,View 代表的是系統(tǒng)中選擇顯示什么和怎么顯示的部分,Controller 指的是系統(tǒng)中根據(jù)用戶輸入并視需要訪問模型,以決定使用哪個視圖的那部分。
由于 C 由框架自行處理,而 Django 里更關(guān)注的是模型(Model)、模板(Template)和視圖(Views),Django 也被稱為 MTV 框架 。在 MTV 開發(fā)模式中:
M 代表模型(Model),即數(shù)據(jù)存取層。該層處理與數(shù)據(jù)相關(guān)的所有事務(wù):如何存取、如何確認(rèn)有效性、包含哪些行為以及數(shù)據(jù)之間的關(guān)系等。
T 代表模板(Template),即表現(xiàn)層。該層處理與表現(xiàn)相關(guān)的決定:如何在頁面或其他類型文檔中進行顯示。
V代表View,業(yè)務(wù)邏輯層。這一層包含訪問模型的邏輯和按照模板顯示。你可以認(rèn)為它是模型和模板的橋梁。
上面的數(shù)據(jù)庫用的是django自帶的sqlite3,我們也可以使用更方便地mysql,首先配置文件中修改一下mysql配置,上面提到過
這里詳細(xì)說一下mysql的方法,因為上面創(chuàng)建了一個staffadmin的app應(yīng)用,這里我們新建一個應(yīng)用----people


然后修改mysql配置,在我們的項目HELLO/Hello/setting.py中

修改對應(yīng)的mysql數(shù)據(jù)庫、用戶、密碼、端口
然后將我們新建的應(yīng)用(people)添加到 settings.py 中的 INSTALLED_APPS中,也就是告訴Django有這么一個應(yīng)用。

然后修改models.py
我們打開 people/models.py 文件,修改其中的代碼如下:
from django.db import models
# Create your models here.
class Person(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
def __str__(self):
return self.name
我們新建了一個Person類,繼承自models.Model, 一個人有姓名和年齡。
也就相當(dāng)于在mysql中創(chuàng)建了一個person表,然后里面的字段屬性有年齡,名字等
在Django中使用該數(shù)據(jù)庫布局的第一步是將其表述為Python代碼。在通過“startapp”命令創(chuàng)建的“models.py”文件中
例如:
from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()
這段python代碼創(chuàng)建了一個Publisher類,也就等同于在數(shù)據(jù)庫中
CREATE TABLE "books_publisher" (
"id" serial NOT NULL PRIMARY KEY,
"name" varchar(30) NOT NULL,
"address" varchar(50) NOT NULL,
"city" varchar(60) NOT NULL,
"state_province" varchar(30) NOT NULL,
"country" varchar(50) NOT NULL,
"website" varchar(200) NOT NULL
);
每個模型相當(dāng)于單個數(shù)據(jù)庫表,每個屬性也是這個表中的一個字段。 屬性名就是字段名,它的類型(例如 CharField )相當(dāng)于數(shù)據(jù)庫的字段類型 (例如 varchar )。
然后shell創(chuàng)建數(shù)據(jù)表,同步數(shù)據(jù)庫信息
輸入一下命令
# Django 1.6.x 及以下
python manage.py syncdb
# Django 1.7 及以上的版本需要用以下命令
python manage.py makemigrations
python manage.py migrate
先 python manage.py makemigrations [appname]
再 python manage.py migrate [appname]
初始化數(shù)據(jù)庫,如此,我們就可以在django項目中使用mysql數(shù)據(jù)庫了。


然后可以看到數(shù)據(jù)庫里對應(yīng)了相應(yīng)的表
如何使用這個表呢?方法和上面一樣
使用 Django 提供的 QuerySet API
Django提供了豐富的API, 下面演示如何使用它。

我們新建了一個用戶WeizhongTu,它返回了一個類,名字為我們創(chuàng)建的, 那么如何從數(shù)據(jù)庫是查詢到它呢?

我們用了一個 .objects.get() 方法查詢出來符合條件的對象,但是大家注意到了沒有,我的models.py中多寫了def....最后兩行
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
def __unicode__(self):
# 在Python3中使用 def __str__(self):
return self.name
如果我們不添加的話它將返回<Person: Person object>
>>> Person.objects.get(name="WeizhongTu")
<Person: Person object>
>>>
這里并沒有顯示出與WeizhongTu的相關(guān)信息,如果用戶多了就無法知道查詢出來的到底是誰,查詢結(jié)果是否正確,所以我們修改一下 people/models.py,添加最后兩行內(nèi)容
注意:name 和 age 等字段中不能有 __(雙下劃線,因為在Django QuerySet API中有特殊含義(用于關(guān)系,包含,不區(qū)分大小寫,以什么開頭或結(jié)尾,日期的大于小于,正則等)
也不能有Python中的關(guān)鍵字,name 是合法的,student_name 也合法,但是student__name不合法,try, class, continue 也不合法,因為它是Python的關(guān)鍵字( import keyword; print(keyword.kwlist) 可以打出所有的關(guān)鍵字)
新建一個對象的方法有以下幾種:
Person.objects.create(name=name,age=age)
p = Person(name="WZ", age=23)
p.save()
p = Person(name="TWZ")
p.age = 23
p.save()
Person.objects.get_or_create(name="WZT", age=23)
這種方法是防止重復(fù)很好的方法,但是速度要相對慢些,返回一個元組,第一個為Person對象,第二個為True或False, 新建時返回的是True, 已經(jīng)存在時返回False.
獲取對象有以下方法:
Person.objects.all()
Person.objects.all()[:10] 切片操作,獲取10個人,不支持負(fù)索引,切片可以節(jié)約內(nèi)存
Person.objects.get(name=name)
get是用來獲取一個對象的,如果需要獲取滿足條件的一些人,就要用到filter
Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") 名稱嚴(yán)格等于 "abc" 的人
Person.objects.filter(name__iexact="abc") # 名稱為 abc 但是不區(qū)分大小寫,可以找到 ABC, Abc, aBC,這些都符合條件
Person.objects.filter(name__contains="abc") # 名稱中包含 "abc"的人
Person.objects.filter(name__icontains="abc") #名稱中包含 "abc",且abc不區(qū)分大小寫
Person.objects.filter(name__regex="^abc") # 正則表達(dá)式查詢
Person.objects.filter(name__iregex="^abc") # 正則表達(dá)式不區(qū)分大小寫
filter是找出滿足條件的,當(dāng)然也有排除符合某條件的
Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person對象
Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名稱含有abc, 但是排除年齡是23
然后注冊我們的models在admin上,效果和上面是一樣的
