基于 class 的通用视图中的冗余

Redundancy in class based generic views

我有两个简单的基于 class 的通用视图,它们只呈现一个模板。因为它们看起来几乎一样,我想保持干燥我想问你,现在最聪明和最好的实施方式是什么:

第一次观看

class Foo(TemplateView):
  template_name = "Foo.html"

  def get_context_data(self, **kwargs):
    user = User.objects.get(username = self.request.user)
    context = super(Foo, self).get_context_data(**kwargs)
    context['foo_objs'] = Foo.objects.filter(user = user.id)
    return context

class Bar(TemplateView):
  template_name = "bar.html"

  def get_context_data(self, **kwargs):
    user = User.objects.get(username = self.request.user)
    context = super(Bar, self).get_context_data(**kwargs)
    context['bar_objs'] = Bar.objects.filter(user = user.id)
    return context

创建具有附加属性 model 的中间视图 class,然后从中继承您的视图:

class ModelListTemplateView(TemplateView):

    model = None

    def get_template_names(self):
        return [self.model._meta.model_name + '.html']

    def get_context_data(self, **kwargs):
        context = super(ModelListTemplateView, self).get_context_data(**kwargs)
        user = User.objects.get(username=self.request.user)
        context['%s_objs' % self.model._meta.model_name] = \
                                    self.model.objects.filter(user=user.id)
        return context


class FooView(ModelListTemplateView):
    model = Foo

class BarView(ModelListTemplateView):
    model = Bar