如果看過(guò)很多的Django的開(kāi)源項(xiàng)目洲炊,發(fā)現(xiàn)開(kāi)始在views.py
中的都是以函數(shù)def XXX(request):
的方式做處理形导。這種是很簡(jiǎn)單婉烟,但是對(duì)于OOP思想來(lái)講,這樣是有點(diǎn)out-dated了设江。Django現(xiàn)在更常用的是基于類(lèi)的視圖做處理锦茁。
基于類(lèi)的視圖,說(shuō)起來(lái)簡(jiǎn)單绣硝,但是也費(fèi)勁蜻势。我再一一道來(lái)撑刺,_鹉胖。
基于類(lèi)的視圖使用
1. urls.py的改變
如果使用的是視圖類(lèi),那么在url中處理的方法需要改為`XXView.as_views()`。這個(gè)相當(dāng)于是一個(gè)入口甫菠,初始化一個(gè)view類(lèi)的實(shí)例挠铲,同時(shí)調(diào)用dispatch
方法。
2. views.py的改變
你可以繼承很多類(lèi)寂诱,但是基本的可以用templateview拂苹,但常用的是自己建立一個(gè)類(lèi)(父類(lèi)是View)。
1). 設(shè)定類(lèi)屬性痰洒,比如: form_class
瓢棒、template_name
2). 可以覆蓋get、post方法丘喻,例如最簡(jiǎn)單的:
def get(self, request, *args, **kwargs):
form = self.form_class()
return render(request, self.template_name, {'form': form})
3). post方法常常要求一些限制脯宿,比如原子操作,或者需已登錄:
如果是原子操作泉粉,在post方法前使用@transaction.atomic
;
如果是需登錄连霉,抱歉,直接將login_required是不行的嗡靡。正確的做法是重寫(xiě)dispatch方法:
@method_decorator(login_required) def dispatch(self, request, *args, **kwargs): return super(YourView, self).dispatch(request, *args, **kwargs)
4). 返回
- 如果是指定某個(gè)界面跺撼,使用:
return render(request, self.template_name, {
'form': form,
})
- 如果是重定向到其他頁(yè)面,使用redirect讨彼。使用next是歉井,比如直接點(diǎn)某個(gè)界面,但是需要先登錄哈误,所以網(wǎng)址會(huì)先到登錄界面酣难。此時(shí)你注意網(wǎng)址的get參數(shù)是有next的,表示下一個(gè)要去的網(wǎng)址黑滴。:
return redirect(request.GET['next'] if 'next' in request.GET else 'home')
結(jié)語(yǔ)
當(dāng)然常常view類(lèi)是和form類(lèi)一起使用的(因?yàn)樘峤槐韱蔚年P(guān)系)憨募,下一篇會(huì)講使用到的form類(lèi)。