所以我开始使用基于泛型类的视图,我得说,它们确实可以节省时间。但我想知道是否可以使用mixins来提供通用impl,而不是必须在每个视图中编码。例如
我有ListView
和DetailView
。为了限制列表和编辑,我可以覆盖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背景,所以我同时感到敬畏和恐惧]
答案 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 DJANGO的Chapter-8: Best Practices for Class-Based Views
,
第三方套餐: CBV + django-braces非常棒我们一起感受 django-braces是Django CBV缺失的组件。它 提供了一组明确编码的混合,使Django CBV更多 实施起来更容易,更快捷。接下来的几章将展示 它是各种代码示例中的混合。