實(shí)現(xiàn)視圖視圖是一個(gè)簡(jiǎn)單的 Python 方法,它接受一個(gè)請求對(duì)象,負(fù)責(zé)實(shí)現(xiàn):任何業(yè)務(wù)邏輯(直接或間接)上下文字典,它包含模板數(shù)據(jù)使用一個(gè)
視圖是一個(gè)簡(jiǎn)單的 Python 方法,它接受一個(gè)請求對(duì)象,負(fù)責(zé)實(shí)現(xiàn):
在 Django 中,當(dāng)一個(gè) URL 被請求時(shí),所調(diào)用的 Python 方法稱(chēng)為一個(gè)視圖(view),這個(gè)視圖所加載並呈現(xiàn)的頁(yè)面稱(chēng)為模板(template)。由於這個(gè)原因,Django 小組將 Django 稱(chēng)為一個(gè) MVT(model-view-template)框架。另一方面,TurboGears 把自己的方法稱(chēng)作控制器(controller),將所呈現(xiàn)的模板稱(chēng)為視圖(view),因此縮寫(xiě)也是 MVC。其區(qū)別在於廣(guǎng)義的語義,因為它們所實(shí)現(xiàn)的內(nèi)容是相同的。
最簡(jiǎn)單的視圖可能會(huì)返回一個(gè)使用字符串初始化過(guò)的 HttpResponse 對(duì)象。創(chuàng)建下面的方法,並生成一個(gè) /jobs
HTTP 請求,以確保 urls.py 和 views.py 文件都已經(jīng)正確設(shè)置。
1
2
3
4
|
from django.utils.httpwrappers import HttpResponse def index(request): return HttpResponse("Job Index View") |
下面的代碼將獲取最近的 10 個(gè)職位,並通過(guò)一個(gè)模板呈現(xiàn)出來(lái),然後返迴響應(yīng)。沒有 下一節(jié) 中的模板文件,這段代碼就無(wú)法 正常工作。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
from django.template import Context, loader from django.http import HttpResponse from jobs.models import Job from django.template import Context, loader from django.http import HttpResponse from jobs.models import Job def index(request): object_list = Job.objects.order_by('-pub_date')[:10] t = loader.get_template('jobs/job_list.html') c = Context({ 'object_list': object_list, }) return HttpResponse(t.render(c)) |
在上面的代碼中,模板是由 jobs/job_list.html
字符串進(jìn)行命名的。該模板是使用名為 object_list
的職位列表的上下文呈現(xiàn)的。所呈現(xiàn)的模板字符串隨後被傳遞到 HTTPResponse 構(gòu )造器中,後者通過(guò)這個(gè)框架被發(fā)送回請求客戶(hù)機(jī)那裡。
加載模板、創(chuàng)建內(nèi)容以及返回新響應(yīng)對(duì)象的步驟在下面都被 render_to_response
方法取代了。新增內(nèi)容是詳細(xì)視圖方法使用了一個(gè) get_object_or_404
方法,通過(guò)該方法使用所提供的參數(shù)獲取一個(gè) Job 對(duì)象。如果沒有找到這個(gè)對(duì)象,就會(huì)觸發(fā) 404 異常。這兩(liǎng)個(gè)方法減少了很多 Web 應(yīng)用程式中的樣板代碼。
1
2
3
4
5
6
7
8
9
10
11
12
|
from django.shortcuts import get_object_or_404, render_to_response from jobs.models import Job def index(request): object_list = Job.objects.order_by('-pub_date')[:10] return render_to_response('jobs/job_list.html', {'object_list': object_list}) def detail(request, object_id): job = get_object_or_404(Job, pk=object_id) return render_to_response('jobs/job_detail.html', {'object': job}) |
注意,detail
使用 object_id
作為一個(gè)參數(shù)。這是前面提到過(guò)的 jobs urls.py 文件中 /jobs/
URL 路徑後面的數(shù)字。它以後會(huì)作為主鍵(pk)傳遞給 get_object_or_404
方法。
上面的視圖仍然會(huì)失敗,因為它們所加載和呈現(xiàn)的模板(jobs/job_list.html and jobs/job_detail.html)不存在。
Python交流群
635448130點(diǎn)擊加入群聊UI設(shè)計(jì)交流群
579150876點(diǎn)擊加入群聊Unity交流群
495609038點(diǎn)擊加入群聊HTML5交流群
645591648點(diǎn)擊加入群聊