Django篇(一)
- 2019 年 10 月 6 日
- 筆記
首先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 %}
即可。