Django视图、URL、模版简介
Django視圖、URL、模版簡介
文章目錄
- Django視圖、URL、模版簡介
- 一、視圖
- 1.簡介
- 2.使用視圖時需要進行兩步操作:
- 3.定義視圖
- 二、配置URLconf
- 1.查找視圖的過程
- 2.URLconf
- 3.需要兩步完成URLconf配置:
- 4.url匹配的過程
- 5.請求訪問
- 三、模板
- 1.簡介
- 2.創建模板
- 3.定義模板
- 4.視圖調用模板
- 5.視圖調用模板簡寫
- 四、案例
一、視圖
1.簡介
- 后臺管理頁面做好了,接下來就要做公共訪問的頁面了。當我們剛剛在瀏覽器中輸入http://127.0.0.1:8000/admin/ 之后,瀏覽器顯示出了后臺管理的登錄頁面
- 那有沒有同學想過這個服務器是怎么給我們找到這個頁面并返回呢?
- /admin/是我們想要請求的頁面,服務器在收到這個請求之后,就一定對應著一個處理動作,這個處理動作就是幫我們產生頁面內容并返回回來,這個過程是由視圖來做的。
- 對于django的設計框架MVT,用戶在URL中請求的是視圖,視圖接收請求后進行處理,并將處理的結果返回給請求者。
2.使用視圖時需要進行兩步操作:
- 1.定義視圖函數
- 2.配置URLconf
3.定義視圖
- 視圖就是一個Python函數,被定義在views.py中。
- 視圖的必須有一個參數,一般叫request,視圖必須返回HttpResponse對象,HttpResponse中的參數內容會顯示在瀏覽器的頁面上。
打開booktest/views.py文件,定義視圖index如下
from django.http import HttpResponsedef index(request):return HttpResponse("index")二、配置URLconf
1.查找視圖的過程
- 請求者在瀏覽器地址欄中輸入url
- 請求到服務器后,獲取url信息,然后與編寫好的URLconf逐條匹配
- 如果匹配成功則調用對應的視圖函數,如果所有的URLconf都沒有匹配成功,則返回404錯誤。
2.URLconf
一條URLconf包括url規則、視圖兩部分:
- url規則使用正則表達式定義。
- 視圖就是在views.py中定義的視圖函數。
3.需要兩步完成URLconf配置:
url配置的目的是讓建立url和視圖函數的對應關系。url配置項定義在urlpatterns的列表中,每一個配置項都調用url函數。
- 1.url(正則表達式,視圖函數名)
- 2.url(正則表達式,include(應用中的urls文件))
工作中在配置url時,首先在項目的urls.py文件中添加配置項時,并不寫具體的url和視圖函數之間的對應關系,而是包含具體應用的urls.py文件,在應用的urls.py文件中寫url和視圖函數的對應關系。
在booktest/應用下創建urls.py文件,定義代碼如下:
from django.conf.urls import url from booktest import views urlpatterns = [url(r'^$', views.index), ]包含到項目中:打開test1/urls.py文件,為urlpatterns列表增加項如下:
url(r'^', include('booktest.urls')),test1/urls.py文件完整代碼如下:
from django.conf.urls import include, url from django.contrib import adminurlpatterns = [url(r'^admin/', include(admin.site.urls)),url(r'^', include('booktest.urls')), ]4.url匹配的過程
在項目的urls.py文件中包含具體應用的urls.py文件,應用的urls.py文件中寫url和視圖函數的對應關系。
5.請求訪問
視圖和URLconf都定義好了,接下來在瀏覽器地址欄中輸入網址:
http://127.0.0.1:8000/網頁顯示效果如下圖,視圖被成功執行了。
三、模板
1.簡介
問題 :
如何向請求者返回一個漂亮的頁面呢?
- 肯定需要用到html、css,如果想要更炫的效果還要加入js,
- 問題來了,這么一堆字段串全都寫到視圖中,作為HttpResponse()的參數嗎?這樣定義就太麻煩了吧,因為定義字符串是不會出任何效果和錯誤的,
- 如果有一個專門定義前端頁面的地方就好了。
- 解決問題的技術來了:模板。
- 在Django中,將前端的內容定義在模板中,然后再把模板交給視圖調用,各種漂亮、炫酷的效果就出現了。
2.創建模板
為應用booktest下的視圖index創建模板index.html,目錄結構如下圖:
設置查找模板的路徑:打開test1/settings.py文件,設置TEMPLATES的DIRS值
3.定義模板
打開templtes/booktest/index.html文件,定義代碼如下:
<html> <head><title>圖書列表</title> </head> <body> <h1>{{title}}</h1> {%for i in list%} {{i}}<br> {%endfor%} </body> </html>- 在模板中輸出變量語法如下,變量可能是從視圖中傳遞過來的,也可能是在模板中定義的。
- 在模板中編寫代碼段語法如下:
4.視圖調用模板
調用模板分為三步驟:
- 1.找到模板(去模板目錄下面獲取html文件的內容,得到一個模板對象)
- 2.定義上下文(向模板文件傳遞數據)
- 3.渲染模板(得到一個標準的html內容)
打開booktst/views.py文件,調用上面定義的模板文件
from django.http import HttpResponse from django.template import loader,RequestContextdef index(request):# 1.獲取模板template=loader.get_template('booktest/index.html')# 2.定義上下文context=RequestContext(request,{'title':'圖書列表','list':range(10)})# 3.渲染模板return HttpResponse(template.render(context))打開瀏覽器刷新頁面,顯示效果如下圖:
5.視圖調用模板簡寫
視圖調用模板都要執行以上三部分,于是Django提供了一個函數render封裝了以上代碼。 方法render包含3個參數:
- 第一個參數為request對象
- 第二個參數為模板文件路徑
- 第三個參數為字典,表示向模板中傳遞的上下文數據
打開booktst/views.py文件,調用render的代碼如下:
from django.shortcuts import renderdef index(request):context={'title':'圖書列表','list':range(10)}return render(request,'booktest/index.html',context)四、案例
- 定義視圖
編寫booktest/views.py文件如下:
from django.shortcuts import render from booktest.models import BookInfo#首頁,展示所有圖書 def index(reqeust):#查詢所有圖書booklist = BookInfo.objects.all()#將圖書列表傳遞到模板中,然后渲染模板return render(reqeust, 'booktest/index.html', {'booklist': booklist})#詳細頁,接收圖書的編號,根據編號查詢,再通過關系找到本圖書的所有英雄并展示 def detail(reqeust, bid):#根據圖書編號對應圖書book = BookInfo.objects.get(id=int(bid))#查找book圖書中的所有英雄信息heros = book.heroinfo_set.all()#將圖書信息傳遞到模板中,然后渲染模板return render(reqeust, 'booktest/detail.html', {'book':book,'heros':heros})- 定義URLconf
編寫booktest/urls.py文件如下:
from django.conf.urls import url #引入視圖模塊 from booktest import views urlpatterns = [#配置首頁urlurl(r'^$', views.index),#配置詳細頁url,\d+表示多個數字,小括號用于取值,建議復習下正則表達式url(r'^(\d+)/$',views.detail), ]- 定義模板
編寫templates/booktest/index.html文件如下:
<html> <head><title>首頁</title> </head> <body> <h1>圖書列表</h1> <ul>{#遍歷圖書列表#}{%for book in booklist%}<li>{#輸出圖書名稱,并設置超鏈接,鏈接地址是一個數字#}<a href="/{{book.id}}/">{{book.btitle}}</a></li>{%endfor%} </ul> </body> </html>編寫templates/booktest/detail.html文件如下:
<html> <head><title>詳細頁</title> </head> <body> {#輸出圖書標題#} <h1>{{book.btitle}}</h1> <ul>{#通過關系找到本圖書的所有英雄,并遍歷#}{%for hero in heros%}{#輸出英雄的姓名及描述#}<li>{{hero.hname}}---{{hero.hcomment}}</li>{%endfor%} </ul> </body> </html>總結
以上是生活随笔為你收集整理的Django视图、URL、模版简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DjangoORM框架
- 下一篇: Django模型(一)