5

所以我开始使用基于通用类的视图,我得说,它们确实节省了时间。但我想知道是否可以使用 mixins 来提供通用 impl 而不必在每个视图中编写代码。例如,我有一个ListViewand 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,我完全确定 mixins 是如何工作的 [来自 java 背景,所以我同时感到敬畏和恐惧]

4

2 回答 2

9

您实际上几乎自己找到了答案。您可以编写以下 Mixin:

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

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

class RepublicListView(LoginRequiredMixin, UserFilterMixin, ListView):

以此类推其他类...

于 2013-03-21T12:30:01.583 回答
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

根据DJANGO 的Chapter-8: Best Practices for Class-Based Views两勺,

第三方包: CBVs + django-braces 一起很棒 我们觉得 django-braces 是 Django CBVs 缺少的组件。它提供了一组清晰编码的 mixin,使 Django CBV 更容易和更快地实现。!e 下几章将在各种代码示例中演示它的 mixin。

于 2013-01-22T05:01:11.850 回答