楊剛
摘要:Django是一個開源的Web開發(fā)框架,它為Web開發(fā)中的常見問題提供了完整的解決方案。Django定義了一些基于類的通用視圖,用于解決一些常見的Web任務(wù)。該文主要介紹了類視圖的基本用法以及幾個常用的類視圖。
關(guān)鍵詞:Django;類;Web
中圖分類號:TP311 文獻標(biāo)識碼:A 文章編號:1009-3044(2016)13-0103-02
1類視圖的基本使用
Django中的視圖是一個可調(diào)用對象,在Django的早期版本中,視圖用函數(shù)來實現(xiàn)。隨著Django的不斷發(fā)展,Django的技術(shù)團隊提供了新的實現(xiàn),用類來表示視圖,并且針對Web開發(fā)中的常見任務(wù),定義了大量的通用類視圖。使用基于類的視圖,可以更好的構(gòu)建視圖的內(nèi)在邏輯,并且利于繼承和混合重用。使用基于類的視圖主要用2種方式:
1)在URLconf 中的簡單用法
如果只是修改類的一些簡單的屬性,在URLconf 中直接使用基于類的視圖,是最簡單職業(yè)的方法??梢詫⒁薷牡膶傩灾苯觽鬟f給類視圖的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))]
在這個例子中,我們設(shè)置TemplateView的template_name屬性??梢允褂妙愃频姆椒ǜ采wRedirectView 的query_string屬性。
2)子類化通用視圖
使用類視圖的第二種方法是繼承一個已經(jīng)存在的類視圖,然后在子類中覆蓋其屬性或方法、例如,考慮只顯示一個模板home.html 的視圖。Django 有一個通用視圖TemplateView來做這件事,所以我們可以簡單地子類化它,并覆蓋模板的名稱:
fromdjango.views.genericimportTemplateView
classHomeView(TemplateView):
template_name="home.html"
然后我們只需要添加這個新的視圖到我們的URLconf 中。TemplateView是一個類不是一個函數(shù),所以我們將URL 指向類的as_view()方法,它讓基于類的視圖提供一個類似函數(shù)的入口:
fromdjango.conf.urlsimporturl
fromsome_app.viewsimportAboutView
urlpatterns=[url(r'^about/',AboutView.as_view())]
2幾種常用的類視圖
針對Web開發(fā)中的常見任務(wù),Django定義了一組基礎(chǔ)視圖、一組通用顯示視圖以及一組通用編輯視圖等類視圖。下面依次介紹幾個常用的類視圖。
1)TemplateView
TemplateView是基礎(chǔ)視圖。該視圖主要用于渲染一個給定的模板。它的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是一個通用顯示視圖,主要用于顯示一個對象列表。可以通過重寫它的get_queryset方法,來獲取要顯示的列表。
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方法可以動態(tài)的根據(jù)app和model來獲取模型,列表的查詢參數(shù)可以寫在url的后面。
3)DeleteView
DeleteView是一個通用編輯視圖,主要用于刪除一個指定的對象??梢酝ㄟ^重寫它的get_object方法,來指定要刪除的對象。
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也是一個通用編輯視圖,主要用于創(chuàng)建一個對象。可以通過重寫它的get_initial進行初始化,可以通過重寫get_template_names方法來指定模板。
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']
通過使用Django中的通用類視圖,可以大幅提高工作效率。
參考文獻:
[1] 楊志慶.基于Django的Blog系統(tǒng)的開發(fā)與實現(xiàn)[J].機電一體化,2013(9).