Django視圖指向一個函數(shù),如果您只想更改一些功能,則可能會出現(xiàn)問題。是的,函數(shù)中可以有數(shù)百萬個關鍵字參數(shù),如果有語句,甚至可以更多,但是我在想更多的面向?qū)ο蠓椒?。例如,我有一個顯示用戶的頁面。該頁面與顯示組的頁面非常相似,但仍與僅使用另一個數(shù)據(jù)模型不太相似。小組也有成員等...一種方法是將視圖指向類方法,然后擴展該類。有沒有人嘗試過這種方法或有其他想法?
3 回答

慕工程0101907
TA貢獻1887條經(jīng)驗 獲得超5個贊
我需要使用基于類的視圖,但是我希望能夠在URLconf中使用類的全名,而不必始終在使用它之前實例化視圖類。幫助我的是一個非常簡單的元類:
class CallableViewClass(type): def __call__(cls, *args, **kwargs): if args and isinstance(args[0], HttpRequest): instance = super(CallableViewClass, cls).__call__() return instance.__call__(*args, **kwargs) else: instance = super(CallableViewClass, cls).__call__(*args, **kwargs) return instanceclass View(object): __metaclass__ = CallableViewClass def __call__(self, request, *args, **kwargs): if hasattr(self, request.method): handler = getattr(self, request.method) if hasattr(handler, '__call__'): return handler(request, *args, **kwargs) return HttpResponseBadRequest('Method Not Allowed', status=405)
現(xiàn)在,我既可以實例化視圖類,也可以將實例用作視圖函數(shù),或者我可以簡單地將URLconf指向我的類,并讓元類為我實例化(并調(diào)用)視圖類。這是通過檢查第一個參數(shù)__call__
-如果它是a來實現(xiàn)的HttpRequest
,它必須是一個實際的HTTP請求,因為試圖用實例來實例化視圖類是沒有意義的HttpRequest
。
class MyView(View): def __init__(self, arg=None): self.arg = arg def GET(request): return HttpResponse(self.arg or 'no args provided')@login_requiredclass MyOtherView(View): def POST(request): pass# And all the following work as expected.urlpatterns = patterns('' url(r'^myview1$', 'myapp.views.MyView', name='myview1'), url(r'^myview2$', myapp.views.MyView, name='myview2'), url(r'^myview3$', myapp.views.MyView('foobar'), name='myview3'), url(r'^myotherview$', 'myapp.views.MyOtherView', name='otherview'),)

縹緲止盈
TA貢獻2041條經(jīng)驗 獲得超4個贊
如果您只是顯示模型中的數(shù)據(jù),為什么不使用Django Generic Views?它們的設計使您可以輕松顯示模型中的數(shù)據(jù),而無需編寫自己的視圖以及將URL參數(shù)映射到視圖,獲取數(shù)據(jù),處理邊緣情況,呈現(xiàn)輸出等方面的知識。
添加回答
舉報
0/150
提交
取消