django中的Python多重继承函数覆盖和ListView

标签 python django listview multiple-inheritance django-generic-views

我创建了一个子类 ListView 和两个自定义 mixin,它们实现了 get_context_data 函数。我想在子类上覆盖这个函数:

from django.views.generic import ListView

class ListSortedMixin(object):
    def get_context_data(self, **kwargs):
        print 'ListSortedMixin'
        return kwargs

class ListPaginatedMixin(object):
    def get_context_data(self, **kwargs):
        print 'ListPaginatedMixin'
        return kwargs

class MyListView(ListSortedMixin, ListPaginatedMixin, ListView):
  def get_context_data(self, **context):
    super(ListSortedMixin,self).get_context_data(**context)
    super(ListPaginatedMixin,self).get_context_data(**context)
    return context

当我执行 MyListView 时,它只打印 "ListSortedMixin"。由于某种原因,python 正在执行 ListSortedMixin.get_context_data 代替 MyListView.get_context_data。为什么?

如果我将继承顺序更改为 ListPaginatedMixin, ListSortedMixin, ListView,则执行 ListPaginatedMixin.get_context_data

如何覆盖 get_context_data 函数?

最佳答案

这是一个老问题,但我认为答案不正确。您的代码中有错误。它应该是:

class MyListView(ListSortedMixin, ListPaginatedMixin, ListView):
    def get_context_data(self, **context):
        super(MyListView,self).get_context_data(**context)
        return context

get_context_data 的调用顺序与 MyListView 声明中指定的顺序相同。注意 super 的参数是 MyListView 而不是父类(super class)。

更新:

我错过了你的 mixin 不调用 super。他们应该。是的,即使它们继承自 object,因为 super 调用 MRO 中的 next 方法,不一定是它所在类的父类。

from django.views.generic import ListView

class ListSortedMixin(object):
    def get_context_data(self, **kwargs):
        print 'ListSortedMixin'
        return super(ListSortedMixin,self).get_context_data(**context)

class ListPaginatedMixin(object):
    def get_context_data(self, **kwargs):
        print 'ListPaginatedMixin'
        return super(ListPaginatedMixin,self).get_context_data(**context)

class MyListView(ListSortedMixin, ListPaginatedMixin, ListView):
    def get_context_data(self, **context):
        return super(MyListView,self).get_context_data(**context)

对于 MyListView,MRO 是:

  1. 我的 ListView
  2. ListSortedMixin
  3. ListPaginatedMixin
  4. ListView
  5. ListView 上面的内容 ... n.对象

一个一个地调用它们可能会起作用,但这不是它的预期使用方式。

更新 2

复制粘贴示例来证明我的观点。

class Parent(object):
    def get_context_data(self, **kwargs):
        print 'Parent'

class ListSortedMixin(object):
    def get_context_data(self, **kwargs):
        print 'ListSortedMixin'
        return super(ListSortedMixin,self).get_context_data(**kwargs)

class ListPaginatedMixin(object):
    def get_context_data(self, **kwargs):
        print 'ListPaginatedMixin'
        return super(ListPaginatedMixin,self).get_context_data(**kwargs)

class MyListView(ListSortedMixin, ListPaginatedMixin, Parent):
    def get_context_data(self, **kwargs):
        return super(MyListView,self).get_context_data(**kwargs)


m = MyListView()
m.get_context_data(l='l')

关于django中的Python多重继承函数覆盖和ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9939256/

相关文章:

django - 使用 AJAX 上传图像,裁剪我们选择的部分,并保存在 django 管理中

android ListView 查看器。什么时候用,什么时候不用

python - 将 csv 文件导入到列表列表中

python - django 中@login_required 和@method_decorator(login_required) 有什么区别

python - 为什么 Stripe-Signature header 永远不会匹配 request.body 的签名?

python - 默认的 django 元素不显示 django 模板

python - 以有效的方式从列表中消除特定元素的函数

Python。是否可以从变量值不断增加的循环中制作单行代码?

android: listview 项目宽度 fill_parent 不工作

java - wicket : only change single component (label) in ListView