楊剛
摘要:Django是一個(gè)開源的Web開發(fā)框架,它為Web開發(fā)中的常見問(wèn)題提供了完整的解決方案。Django定義了一些基于類的通用視圖,用于解決一些常見的Web任務(wù)。該文主要介紹了類視圖的基本用法以及幾個(gè)常用的類視圖。
關(guān)鍵詞:Django;類;Web
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2016)13-0103-02
1類視圖的基本使用
Django中的視圖是一個(gè)可調(diào)用對(duì)象,在Django的早期版本中,視圖用函數(shù)來(lái)實(shí)現(xiàn)。隨著Django的不斷發(fā)展,Django的技術(shù)團(tuán)隊(duì)提供了新的實(shí)現(xiàn),用類來(lái)表示視圖,并且針對(duì)Web開發(fā)中的常見任務(wù),定義了大量的通用類視圖。使用基于類的視圖,可以更好的構(gòu)建視圖的內(nèi)在邏輯,并且利于繼承和混合重用。使用基于類的視圖主要用2種方式:
1)在URLconf 中的簡(jiǎn)單用法
如果只是修改類的一些簡(jiǎn)單的屬性,在URLconf 中直接使用基于類的視圖,是最簡(jiǎn)單職業(yè)的方法。可以將要修改的屬性直接傳遞給類視圖的as_view() 方法:
from django.conf.urls import url
from django.views.generic import TemplateView
urlpatterns=[url(
r'^home/',TemplateView.as_view(template_name="about.html))]
在這個(gè)例子中,我們?cè)O(shè)置TemplateView的template_name屬性??梢允褂妙愃频姆椒ǜ采wRedirectView 的query_string屬性。
2)子類化通用視圖
使用類視圖的第二種方法是繼承一個(gè)已經(jīng)存在的類視圖,然后在子類中覆蓋其屬性或方法、例如,考慮只顯示一個(gè)模板home.html 的視圖。Django 有一個(gè)通用視圖TemplateView來(lái)做這件事,所以我們可以簡(jiǎn)單地子類化它,并覆蓋模板的名稱:
fromdjango.views.genericimportTemplateView
classHomeView(TemplateView):
template_name="home.html"
然后我們只需要添加這個(gè)新的視圖到我們的URLconf 中。TemplateView是一個(gè)類不是一個(gè)函數(shù),所以我們將URL 指向類的as_view()方法,它讓基于類的視圖提供一個(gè)類似函數(shù)的入口:
fromdjango.conf.urlsimporturl
fromsome_app.viewsimportAboutView
urlpatterns=[url(r'^about/',AboutView.as_view())]
2幾種常用的類視圖
針對(duì)Web開發(fā)中的常見任務(wù),Django定義了一組基礎(chǔ)視圖、一組通用顯示視圖以及一組通用編輯視圖等類視圖。下面依次介紹幾個(gè)常用的類視圖。
1)TemplateView
TemplateView是基礎(chǔ)視圖。該視圖主要用于渲染一個(gè)給定的模板。它的template_name屬性用于指定模板,get_context_data方法用于獲得顯示在模板中的數(shù)據(jù)。
classHomePageView(TemplateView):
template_name="home.html"
defget_context_data(self,**kwargs):
context=super(HomePageView,self).get_context_data(**kwargs)
context['latest_articles']=Article.objects.all()[:5]
returncontext
2)ListView
ListView是一個(gè)通用顯示視圖,主要用于顯示一個(gè)對(duì)象列表??梢酝ㄟ^(guò)重寫它的get_queryset方法,來(lái)獲取要顯示的列表。
class ObjectList(ListView):
def get_queryset(self):
modelobj = get_model(self.kwargs['app'], self.kwargs['model'])
# 獲得url后的參數(shù)
kwargs = self.request.GET.dict()
return modelobj.objects.filter(**kwargs)
在get_queryset方法中,使用get_model方法可以動(dòng)態(tài)的根據(jù)app和model來(lái)獲取模型,列表的查詢參數(shù)可以寫在url的后面。
3)DeleteView
DeleteView是一個(gè)通用編輯視圖,主要用于刪除一個(gè)指定的對(duì)象??梢酝ㄟ^(guò)重寫它的get_object方法,來(lái)指定要?jiǎng)h除的對(duì)象。
class ObjectDelete(DeleteView):
def get_object(self):
modelobj = get_model(self.kwargs['app'], self.kwargs['model'])
obj = modelobj.objects.get(pk=self.kwargs['pk'])
return obj
4)CreateView
CreateView也是一個(gè)通用編輯視圖,主要用于創(chuàng)建一個(gè)對(duì)象??梢酝ㄟ^(guò)重寫它的get_initial進(jìn)行初始化,可以通過(guò)重寫get_template_names方法來(lái)指定模板。
class ObjectCreate(CreateView):
def get_initial(self):
return self.request.GET.dict()
def get_template_names(self):
'''如果模型中制定了模板,則使用該模板,否則使用默認(rèn)的模板'''
modelobj = get_model(self.kwargs['app'], self.kwargs['model'])
if hasattr(modelobj.Display, 'create_template'):
return modelobj.Display.create_template
else:
return ['xadmin/object.html']
通過(guò)使用Django中的通用類視圖,可以大幅提高工作效率。
參考文獻(xiàn):
[1] 楊志慶.基于Django的Blog系統(tǒng)的開發(fā)與實(shí)現(xiàn)[J].機(jī)電一體化,2013(9).