在基于类的视图中使用mixins - Django

时间:2013-01-22 02:53:56

标签: django django-class-based-views

所以我开始使用基于泛型类的视图,我得说,它们确实可以节省时间。但我想知道是否可以使用mixins来提供通用impl,而不是必须在每个视图中编码。例如 我有ListViewDetailView。为了限制列表和编辑,我可以覆盖get_queryset()并由登录用户对其进行过滤。但正如你猜测的那样,我必须在每个视图中都这样做,

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

我想知道mixins,我很确定mixin是如何工作的[来自java背景,所以我同时感到敬畏和恐惧]

2 个答案:

答案 0 :(得分:9)

你实际上几乎找到了自己的答案。你可以写下面的Mixin:

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

然后在像这样的类中使用它:

class RepublicListView(LoginRequiredMixin, UserFilterMixin, ListView):

等其他课程......

答案 1 :(得分:2)

您可以使用django-braces中的LoginRequiredMixin

from django.views.generic import ListView, DetailView

from braces.views import LoginRequiredMixin


class JediListView(LoginRequiredMixin, ListView):
    model = JediModel


class JediDetailView(LoginRequiredMixin, Detail):
    model = JediModel

根据TWO SCOOPS of DJANGOChapter-8: Best Practices for Class-Based Views

  

第三方套餐: CBV + django-braces非常棒我们一起感受   django-braces是Django CBV缺失的组件。它   提供了一组明确编码的混合,使Django CBV更多   实施起来更容易,更快捷。接下来的几章将展示   它是各种代码示例中的混合。