Django篇(一)

  • 2019 年 10 月 6 日
  • 筆記

Django模式

首先Django是遵循MVC模式的。

M:Model,模型,與資料庫進行交互

V:View,視圖 html頁面

C:Controller,控制器,接收請求,處理,返回數據,與視圖進行交互

MVC中重要的思想就是解耦,各自干自己的事情。

簡單整理一下思路:

比如一個登陸網頁(也就是視圖),點擊登陸的時候,將帳號和密碼發送到MVC框架中的控制器(Controller),我們從控制器中進行處理,需要去查詢資料庫,但是這裡不會直接去操作資料庫,我們通過Model去進行操作資料庫,回來也一樣的。

在Django中,Django把控制器變成了Template,其實是一樣的,就是名字不一樣了,他把自己的模式叫做MVT。

不同的是:V變成了和MVC中C的功能相同,T和MVC中的V功能相同。

雖然他自己叫做MVT,本質還是遵循的MVC。

安裝虛擬環境

安裝一個和python一樣的虛擬環境,使這個項目用到的模組與其他項目無關。

首先需要安裝模組:

pip3 install virtualenv

上面操作密令比較複雜,安裝一個擴展包:

pip3 install virtualenvwrapper-win

這時我們創建一個虛擬環境都是在C盤,我們給他換個路徑。

添加環境變數:

此電腦->屬性->高級->環境變數->在系統變數點擊添加,變數名寫WORKON_HOME,變數值寫一個路徑,(你創建虛擬環境想放的地方)

創建虛擬環境命令:mkvirtualenv 名字

如果你安裝了python3和python2 用-p指定用哪個版本。

退出虛擬環境:deactivate

進入一個虛擬環境:workon 名字

查看自己創建了那些虛擬環境 workon

刪除一個虛擬環境:rmvirtualenv 名字

創建這個虛擬環境後,你安裝的包都是在你設定的文件夾下。並且創建的命令都是一樣的。

創建一個項目

1、創建虛擬環境:

我們創建一個虛擬環境名字為djangostudy:mkvirtualenv djangostudy

2、安裝Django框架

安裝Django框架(在虛擬環境中使用pip):pip install django==1.8.2(==表示指定本版,不加也可以)

查看我們虛擬環境安裝了上面模組:pip list。

3、創建一個項目

在創建項目前我們創建一個文件夾來放我們的項目:md 文件夾名字

我就創建一個xuexi的目錄了。執行創建文件夾的密令的時候,要切換到虛擬換件文件夾下。

創建了xuexi後,我們cd xuexi到這個文件夾下。

創建一個項目:django-admin startproject 項目名字

我的項目名字就寫test1。

4、目錄結構

可以看到在xuexi下看到:

test1

__init__ 說明 test1 是一個python包

settings.py 配置文件

urls.py 路由配置

wsgi.py (wsgi協議)伺服器和Django交互入口

manage.py 管理文件

5、創建一個應用

首先切換目錄到test1中,cd test1。

一個模組對應一個應用,創建命令:python manage.py startapp 應用名

我這裡寫student

進入你的剛剛創建的應用你可以看到:

migrations

__init__ 說明migrations是一個包

__init__ 說明你的應用是一個包

admin.py 與網站後台管理相關

models.py 模型

tests.py 測試程式碼文件

views.py 視圖函數

6、將應用和項目聯繫起來

需要修改配置文件,為了方面修改pycharm打開。

6.1、打開配置文件settings.py.

6.2、找到INSTALLED_APPS,把我們的英名名字寫進去。我寫上(有個逗號):'student',

7、運行項目

在tese1下執行命令:python manage.py runserver

他會告訴你在瀏覽器中輸入127.0.0.1:8000/來訪問。

當我們訪問出現:

說明我們已經把項目運行起來了。

ORM框架

意思就是對象關係映射。

Django中內置ORM框架。運用這個框架讓我們在操作資料庫的時候更簡單。

不用再寫一些簡單的Sql語句,通過創建一個類,來一一對應資料庫中表的欄位。

通過操作類來操作資料庫中的表。所以在Models中就寫和資料庫中表,欄位一樣的類。

同時,他也可以根據你創建的類,來給你創建資料庫中的表。

Models

我們在Models.py中寫上:

# 類名字就是表名 ,繼承models.Model表示是一個模型

class stuinfo(models.Model):

# 姓名 CharField(max_length=20) 表示varchar(20)

stuname = models.CharField(max_length=20)

# 生日 DateField日期類型

bri_date = models.DateField()

id主鍵不用我們寫,他會自動生成

其他類型:

BooleanField(default=False) # bool類型,default默認值

ForeignKey('表名') # 設置外鍵 生成表的時候格式是 欄位名_id ,賦值需要直接給對象。

如果我想讓他生成一個表:

分為兩步:先生成遷移文件,利用遷移文件再生成表

1、生成遷移文件

執行命令:python manage.py makemigrations

這個文件會放在migrations目錄下

2、利用遷移文件再生成表

執行命令:python manage.py migrate

就會生成一個資料庫,當然不是mysql資料庫,在Django中如果不設置資料庫用什麼,會默認使用sqlite3資料庫。這裡不多說。

通過Models去操作表:

導入模組

from student.models import stuinfo

# 這裡有日期,就導入一下日期模組

from datetime import date

# 添加一條數據:

s = stuinfo()

s.stuname = '張三'

s.bri_date = dete('2000','1','1')

s.save()

# 查詢一條數據 找到id = 1的數據

s1 = student.objects.get(id = 1)

# 查詢所有

s2 = student.objects.all()

# 顯示數據

s1.stuname

s1.bri_date

# 修改

s1.stuname = '123'

s1.save()

# 刪除

s1.delete()

多表聯查

我們再在Models中添加一個類:

class person(models.Model):

# name

name = models.CharField(max_length=20)

# 外鍵

sid = models.ForeignKey('stuinfo')

多表聯查有個外鍵,我們通過外鍵來查詢

通過第一張表查詢第二張表

s1 = student.objects.get(id = 1)

# 這樣就查詢到 nid = 1 的person的表了,在表名後加_set

s1.person_set.all()

通過第二張表查詢第一張表

p1 = person.objects.get(id = 1)

p1.student

p1.student.stuname # 查詢到stuname值

添加第二張表

s1 = student.objects.get(id = 1)

p2 = person()

p2.name = '小花'

# 外鍵需要賦值一個對象

p2.sid = s1

# 查詢外鍵值

賦值是一個對象,那我們怎麼查詢到id值?

p3 = person.objects.get(id = 1)

# 這樣才能查詢到id值,在字典名後加_id

p3.nid_id

後台管理(admin)

Django給我們提供了很快生成後台的管理頁面。

1、修改成中文頁面

修改setting文件,找到LANGUAGE_CODE='en-us'

把他修改成:LANGUAGE_CODE='zh-hans'

2、中國時間

找到TIME_ZONE = 'UTC'修改成

TIME_ZONE = 'Asia/Shanghai'

3、創建管理員賬戶

執行命令:python manage.py createsuperuser

會提示輸入用戶名,郵箱(可以隨意寫)和密碼。自己設置一個就好了

4、運行項目

運行命令:python manage.py runserver

5、登陸管理員頁面

在瀏覽器中輸入127.0.0.1:8000/admin ,就會進入管理員頁面,登陸就好了。

6、註冊模型類

在admin.py中註冊模型類,來幫助我們生成對應的管理頁面。

對我們的stuinfo表進入註冊。

在admin.py中添加:

from student.models import stuinfo

admin.site.register(stuinfo)

這樣就完成了對stuinfo表的註冊。

接下來刷新我們的瀏覽器的管理頁面。

就會多出一個隊stuinfo表的管理。

我們可以在裡面對stuinfo表操作,添加數據。

保存之後會顯示:

我們看到顯示的是一個英文,我想顯示我的名字怎麼辦?

這個stuinfo object 其實是我們str(stuinfo)將一個對象轉化為字元串的結果,

所以我們只需要在Models中的stuinfo中重寫__str__方法即可。

def __str__(self):

return self.stuname

就會變成:

在這個管理頁可以進行添加。刪除,修改,查詢的操作。

自定義管理頁面

在admin.py中創建自定義管理的類

注意:list_display這個名字只能寫這個名字。

我們的管理頁面就會變成:

視圖views

實現瀏覽器訪問127.0.0.1:8080/index,顯示:我是index頁。

在視圖中寫:

# 導入模組

from django.http import HttpResponse

定義index方法,必須要有參數,(用於接收參數)

def index(request):

return HttpResponse('我是index頁')

在student目錄下創建一個urls.py寫上:

from django.conf.urls import url

from student import views

# 建立與視圖的對應關係,urlpatterns不要變

# 第一個是正則,匹配到返回的頁面

urlpatterns = [

url(r'^index$', views.index),

]

修改test1問價下的urls.py:

修改urlpatterns成:

urlpatterns = [

url(r'^admin/', include(admin.site.urls)),

url(r'^', include('student.urls')), # 讓其路由支援student下的urls

]

即可。

整理一下思路,瀏覽器輸入127.0.0.1:8080/index,伺服器會把index傳遞到test1的url,匹配正則,匹配帶第二個匹配就會去student下的urls中繼續匹配,來完成方法的映射。

模板

1、創建一個文templates文件夾

2、在配置文件(setting.py)中設置網站模板的目錄

在setting.py中找到:TEMPLATES的列表,

把DIRS修改成:

'DIRS':[os.path.join(BASE_DIR,'templates')]

# os.path.join()路徑拼接,BASE_DIR項目的相對路徑。

3、在templates下創建一個stuinfo文件夾,再在stuinfo文件夾下創建一個html文件,寫上:

4、在views中返回這個頁面

# 載入模板,相當於讀取該文件

loader.get_template('stuinfo/index.html')

# 給模板文件數據

# 第一個參數為request,第二個為字典,暫時沒有數據傳過去,為空

context = RequestContext(request, {})

# 把上面兩個結合生成一個html

ret_html = temp.render(context)

# 返回給瀏覽器

return HttpResponse(ret_html)

現在訪問127.0.0.1:8000/index就會返回這是一個模板文件。

由上面我們得知:我們訪問不同的頁面在views中只是 模板不同,參數不同。

我們可以自己寫一個方法來方便我們的操作。

這樣寫了之後,我們依然可以訪問,但是這樣的程式碼不許需要我們來寫,在Django中已經封裝好了

我們直接寫成:

就可以達到和我們之前一樣的效果。

4、如何使用views中的參數字典?

例如我們返回值寫上:

def index(request):

# 調用上面的方法即可

return render(request, 'stuinfo/index.html',{'context':'我是傳遞過來的參數'})

在index.html中接收:

# 兩個花括弧,中間直接寫變數名

{{ context}}

這樣我們的數據就傳遞過去了。

在index.html中使用for循環:

我們傳遞一個列表過去

def index(request):

# 調用上面的方法即可

return render(request, 'stuinfo/index.html',{'context':'我是傳遞過來的參數','list':list(range(10))})

在index.html中便利循環出來

# 開始for循環

{% for i in list%}

{{i}}

# 結數for循環

{% endfor %}

即可。