【问题标题】:Redundancy in class based generic views基于类的通用视图中的冗余
【发布时间】:2015-01-26 13:56:19
【问题描述】:

我有两个简单的基于类的通用视图,它们只是呈现一个模板。由于它们看起来几乎相同,并且我想保持干燥,所以我想问你,现在实现这一点的最聪明和最好的方法是什么:

第一次查看

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

【问题讨论】:

  • 您的用户查询是 a) 错误和 b) 不必要的。 self.request.user 已经是 User 实例,不是用户名,所以根本不需要再次查询 User。
  • @DanielRoseman 有一个名为 User 的模型

标签: django django-views django-class-based-views


【解决方案1】:

使用附加属性model 创建中间视图类,然后从中继承您的视图:

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

【讨论】:

  • 谢谢你的回答:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
  • 2016-08-06
  • 1970-01-01
相关资源
最近更新 更多