1. 視圖
后台管理頁面做好了,接下來就要做公共訪問的頁面了。當我們剛剛在瀏覽器中輸入http://127.0.0.1:8000/admin/之后,瀏覽器顯示出了后台管理的登錄頁面,那么服務器是如何找到這個頁面並返回的呢。/admin/是我們想要請求的頁面,服務器在收到這個請求之后,就一定對應着一個處理動作,這個處理動作就是幫我們產生頁面內容並返回回來,這個過程是由視圖來做的。
對於django的設計框架MVT,用戶在URL中請求的是視圖,視圖接收請求后進行處理,並將處理的結果返回給請求者。
1.1 定義視圖
視圖就是一個Python函數,它接受Web請求並且返回Web響應。響應可以是一張網頁的HTML內容,一個重定向,一個404錯誤,一個XML文檔,或者一張圖片. . . 是任何東西都可以。無論視圖本身包含什么邏輯,都要返回響應。代碼寫在哪里也無所謂,只要它在你的Python目錄下面。為了將代碼放在某處,約定是將視圖放置在項目或應用程序目錄中的名為views.py的文件中。
視圖的必須有一個參數,一般叫request,視圖必須返回HttpResponse對象,HttpResponse中的參數內容會顯示在瀏覽器的頁面上。
打開booktest/views.py文件,定義視圖index:
from django.http import HttpResponse def index(request): return HttpResponse("index")
1.2 配置URLconf
請求者在瀏覽器地址欄中輸入url,請求到網站后,獲取url信息,然后與編寫好的URLconf逐條匹配,如果匹配成功則調用對應的視圖函數,如果所有的URLconf都沒有匹配成功,則返回404錯誤。
一條URLconf包括url規則、視圖兩部分:
- url規則使用正則表達式定義。
- 視圖就是在views.py中定義的視圖函數。
需要兩步完成URLconf配置:
- 1.在應用中定義URLconf
- 2.包含到項目的URLconf中
在booktest/應用下創建urls.py文件:
from django.conf.urls import url from booktest import views urlpatterns = [ url(r'^$', views.index), ]
djangotest/urls.py文件修改代碼如下:
from django.contrib import admin from django.urls import path from django.conf.urls import include, url urlpatterns = [ path('admin/', admin.site.urls), url(r'^', include('booktest.urls')), ]
1.3 請求訪問
視圖和URLconf都定義好了,接下來先啟動服務器。
python manage.py runserver
然后在瀏覽器地址欄中輸入網址:
http://127.0.0.1:8000/
網頁顯示效果如下圖,視圖被成功執行了。
2. 模板
在Django中,將前端的內容定義在模板中,然后再把模板交給視圖調用,各種漂亮、炫酷的效果就出現了。
為什么要使用模板呢?
-
對頁面設計進行的任何改變都必須對Python代碼進行相應的修改。 站點設計的修改往往比底層Python代碼的修改要頻繁得多,因此如果可以在不進行Python代碼修改的情況下變更設計,那將會方便得多。
-
Python代碼編寫和HTML設計是兩項不同的工作,大多數專業的網站開發環境都將他們分配給不同的人員(甚至不同部門)來完成。 設計者和HTML/CSS的編碼人員不應該被要求去編輯Python的代碼來完成他們的工作。
-
程序員編寫Python代碼和設計人員制作模板兩項工作同時進行的效率是最高的,遠勝於讓一個人等待另一個人完成對某個既包含 Python又包含 HTML 的文件的編輯工作。
基於這些原因,將頁面的設計和Python的代碼分離開會更干凈簡潔更容易維護。
2.1 創建模板
為應用booktest下的視圖index創建模板index.html。
設置查找模板的路徑:打開djangotest/settings.py文件,設置TEMPLATES的DIRS值。
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', ], }, }, ]
2.2 定義模板
templtes/booktest/index.html文件:
<html> <head> <title>圖書列表</title> </head> <body> <h1>{{title}}</h1> {%for i in list%} {{i}}<br> {%endfor%} </body> </html>
在模板中輸出變量語法如下,變量可能是從視圖中傳遞過來的,也可能是在模板中定義的。
{{變量名}}
在模板中編寫代碼段語法如下:
{%代碼段%}
2.3 視圖調用模板
打開booktest/views.py文件,調用上面定義的模板文件:
from django.shortcuts import render def index(request): context = {'title': '圖書列表', 'list': range(10)} return render(request, 'booktest/index.html', context)
打開瀏覽器刷新頁面。