Django 未调用mixin中的获取上下文数据

Django 未调用mixin中的获取上下文数据,django,Django,我是Django的新手。我想使用mixin将一些数据返回到多个基于类的视图。看起来我在mixin中定义的get\u context\u data没有在view类中调用 class MyMixin(object): def get_context_data(self, *args, **kwargs): data = super(MyMixin, self).get_context_data(*args, **kwargs) from django.util

我是Django的新手。我想使用mixin将一些数据返回到多个基于类的视图。看起来我在mixin中定义的
get\u context\u data
没有在view类中调用

class MyMixin(object):
    def get_context_data(self, *args, **kwargs):
        data = super(MyMixin, self).get_context_data(*args, **kwargs)
        from django.utils import timezone
        data['object'].now = timezone.now()
        return data

class PageDetail(DetailView, MyMixin):
    model = MyModel
    template_name = 'page-detail.html'

    def get_context_data(self, *args, **kwargs):
        data = super(PageDetail, self).get_context_data(*args, **kwargs)
        return data

按错误的顺序定义基类:

因此不调用任何
super()
方法

您应该将
PageDetail
定义为:

class PageDetail(MyMixin, DetailView):
    # ...
类页面详细信息(MyMixin,DetailView):
#…
因此,MRO的定义如下:

>>> PageDetail.__mro__
(<class 'PageDetail'>,
 <class 'django.views.generic.detail.DetailView'>,
 <class 'django.views.generic.detail.SingleObjectTemplateResponseMixin'>,
 <class 'django.views.generic.base.TemplateResponseMixin'>,
 <class 'django.views.generic.detail.BaseDetailView'>,
 <class 'django.views.generic.detail.SingleObjectMixin'>,
 <class 'django.views.generic.base.ContextMixin'>,
 <class 'django.views.generic.base.View'>,
 <class 'MyMixin'>,
 <class 'object'>)
>>> PageDetail.__mro__
(<class 'PageDetail'>,
 <class 'MyMixin'>,
 <class 'django.views.generic.detail.DetailView'>,
 <class 'django.views.generic.detail.SingleObjectTemplateResponseMixin'>,
 <class 'django.views.generic.base.TemplateResponseMixin'>,
 <class 'django.views.generic.detail.BaseDetailView'>,
 <class 'django.views.generic.detail.SingleObjectMixin'>,
 <class 'django.views.generic.base.ContextMixin'>,
 <class 'django.views.generic.base.View'>,
 <class 'object'>)
>>PageDetail.\uu mro__
(,
,
,
,
,
,
,
,
,
)

因此,
super(PageDetail,self).get_context_data(*args,**kwargs)
将调用
MyMixin
类的
get_context_data
,然后在MRO中调用下一个方法。

您应该在
DetailView
之前定义
MyMixin
class PageDetail(MyMixin, DetailView):
    # ...
>>> PageDetail.__mro__
(<class 'PageDetail'>,
 <class 'MyMixin'>,
 <class 'django.views.generic.detail.DetailView'>,
 <class 'django.views.generic.detail.SingleObjectTemplateResponseMixin'>,
 <class 'django.views.generic.base.TemplateResponseMixin'>,
 <class 'django.views.generic.detail.BaseDetailView'>,
 <class 'django.views.generic.detail.SingleObjectMixin'>,
 <class 'django.views.generic.base.ContextMixin'>,
 <class 'django.views.generic.base.View'>,
 <class 'object'>)