2014-07-12 31 views
0

在Django文檔Class based views - Mixins我發現關於使用混入的那包裹as_view()方法來提供額外的功能下面的代碼片斷:Django的混入該渦卷as_view()

from django.contrib.auth.decorators import login_required 

class LoginRequiredMixin(object): 
    @classmethod 
    def as_view(cls, **initkwargs): 
     view = super(LoginRequiredMixin, cls).as_view(**initkwargs) 
     return login_required(view) 

class MyView(LoginRequiredMixin, ...): 
    # this is a generic view 
... 

在上面的例子筆者包裹標準as_view()方法,以便從LoginRequiredMixin繼承的每個視圖都通過login_required裝飾器。

我的問題是這樣的:這條線的工作

view = super(LoginRequiredMixin, cls).as_view(**initkwargs), 

不應View以及MyView繼承?否則,我相信超級電話會失敗,原因是object沒有as_view()方法。

在此先感謝。

回答

2

你應該繼承任何通用的基於類的視圖。 Django定義的所有通用視圖都從基類View繼承。這三個點(...)是任何通用視圖類的佔位符,它們不應被視爲文字(並且這樣做會是語法錯誤)。

順便說一下,裝飾基於類的視圖的最常見方法是使用django.utils.decorators中的method_decoratordispatch方法包裝在裝飾器中。也檢查出decorating class-based views

+0

在示例代碼中,由於3個點可能不夠清楚,但MyView似乎僅從LoginRequiredMixin繼承,而不是View繼承。我假設super會失敗的原因是MyView不能從View繼承(我只看到3個點),結果沒有as_view()方法來調用super。所以,不管MRO,我是否正確? – kstratis

+1

@ Konos5對不起,我誤解了你的問題,我以爲你在問'LoginRequiredMixin'的基類。在我的腦海中,我自動地用適當的課程替換'...'。P但無論如何,你是對的,我更新了我的答案。這就是爲什麼它是一個_view_ mixin。 – knbk

+0

太棒了!這正是我想知道的!贊成視圖繼承解釋也! – kstratis