为通用 get_context_data 扩展通用视图类

Posted

技术标签:

【中文标题】为通用 get_context_data 扩展通用视图类【英文标题】:Extending generic view classes for common get_context_data 【发布时间】:2012-05-07 09:56:27 【问题描述】:

我经常看到自己不得不在我的许多观点的上下文中添加相同的额外变量。

def get_context_data(self, **kwargs):
    # Call the base implementation first to get a context
    context = super(MyListView, self).get_context_data(**kwargs)
    # Add in the house
    context['house'] = self.get_object().house
    return context

由于我不喜欢重复自己,我想我可以创建一个扩展视图的新类,然后我可以将所有视图基于新的扩展视图类。问题是,我使用了 4 类视图:CreateView、UpdateView、ListView 和 DeleteView。我真的必须为它们中的每一个创建一个新类吗?

难道没有类似于 Django“基础”视图类的东西吗?也许是更聪明的方法?

【问题讨论】:

这是一个潜在的解决方案,尽管我不确定我是否对它如此热衷 - reinout.vanrees.org/weblog/2014/05/19/context.html 【参考方案1】:

创建一个 Mixin:

from django.views.generic.base import ContextMixin

class HouseMixin(ContextMixin):
  def get_house(self):
    # Get the house somehow
    return house

  def get_context_data(self, **kwargs):
    ctx = super(HouseMixin, self).get_context_data(**kwargs)
    ctx['house'] = self.get_house()
    return ctx

然后在您的其他类中,您将使用多重继承:

class HouseEditView(HouseMixin, UpdateView):
  pass

class HouseListView(HouseMixin, ListView):
  pass

以此类推,那么所有这些视图的上下文中都会有house

【讨论】:

哇这真的有效!我以为 super(HouseMixin, self).get_context_data(**kwargs) 会返回错误,因为 HouseMixin 的 super 是 object 并且 object 没有定义 get_context_data。你能解释一下它为什么有效吗? 只要其中一个父类实现了该方法,它就可以工作,如果没有,它会引发错误。所以这个 mixin 被设计成与任何也实现了 .get_context_data() 的 Django 视图混合使用。 这与扩展类的顺序有关吗?即 HouseMixin,UpdateView 而不是 UpdateView,HouseMixin 是的,父类的顺序会影响 MRO,请在此处阅读带有其历史链接的 SO 答案:***.com/a/3277407/43490 没关系,我明白了。你只需要class HouseMixin(ContextMixin, View)instrad

以上是关于为通用 get_context_data 扩展通用视图类的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django get_context_data 方法中访问模型的外国座位的元素?

如何编写用于将分隔字符串转换为列表的通用扩展方法?

将通用扩展函数转换为简单的遗留函数

通用无状态组件 React 的类型?或在打字稿中扩展通用函数接口以具有进一步的通用性?

没有 LINQ 扩展的 NHibernate 通用存储库?

通用扩展类 AND 在 Kotlin 中实现接口