2013-01-22 50 views
3

所以我開始使用基於類的視圖,我得說,它們確實節省了時間。但我想知道我是否可以使用mixins來提供泛型impl,而不必在每個視圖中編碼。例如,我有一個ListViewDetailView。要限制列表和編輯,我可以覆蓋get_queryset()並通過登錄用戶對其進行過濾。但正如你猜,我將不得不做,在每個視圖,在基於類的視圖中使用mixins - Django

class JediListView(ListView): 
    def get_queryset(self): 
     q = <call super>.filter(user=request.user) #assume i have 'login_required' in the urls 

class JediDetailView(DetailView): 
    def get_queryset(self): 
     q = <call super>.filter(user=request.user) #assume i have 'login_required' in the urls 

我可以替每個視圖的新的父類,但我仍然會重複的代碼。

class RepublicListView(ListView): 
    # override get_queryset code as above 

class JediListView(RepublicListView): 

# repeat fot DetailView, DeleteView, UpdateView 

我想知道的混入,我完全相信混入如何工作[從Java的背景,所以我很敬畏和恐懼在同一時間]

+0

有人可以編輯這個問題,我不清楚 – mehmet

回答

8

你居然差點被自己找到了答案。你可以寫下面的Mixin:

class UserFilterMixin: 
    def get_queryset(self): 
     return <call super>.filter(user=self.request.user) 

然後在類像這樣使用它:

class RepublicListView(LoginRequiredMixin, UserFilterMixin, ListView): 

等了其他類...

2

您可以使用LoginRequiredMixindjango-braces

from django.views.generic import ListView, DetailView 

from braces.views import LoginRequiredMixin 


class JediListView(LoginRequiredMixin, ListView): 
    model = JediModel 


class JediDetailView(LoginRequiredMixin, Detail): 
    model = JediModel 

Chapter-8: Best Practices for Class-Based ViewsTWO SCOOPS of DJANGO

第三方軟件包: CBVS + Django的括號是偉大的,我們一起來感受這 Django的括號是Django的CBVS缺少的組成部分。它 提供了一組清晰編碼的mixin,使Django CBV的實現更容易,更快速。接下來的幾章將演示 它是各種代碼示例中的mixin。

+0

這實際上不是上述問題的答案。 – melbic

+0

的確,這是我的錯誤。我應該像定義一個'UserFilterMixin'一樣爲當前用戶過濾查詢集。 – pankaj28843