多重继承中的属性覆盖概念(Django-Mixin)
attribute override concept in multiple inheritance (Django-Mixin)
请参考以下代码:
from django.views.generic.edit import DeleteView
from .models import Course
class OwnerMixin(object):
def get_queryset(self):
qs = super(OwnerMixin, self).get_queryset()
return qs.filter(owner=self.request.user)
class OwnerCourseMixin(OwnerMixin):
model = Course
class CourseDeleteView(OwnerCourseMixin, DeleteView):
template_name = 'courses/manage/course/delete.html'
success_url = reverse_lazy('manage_course_list')
我很容易理解,通过在 CourseDeleteView
中添加 template_name
和 success_url
属性,我可以覆盖 DeleteView
中的属性。从而通过调用DeleteView
.
中的方法使两个属性生效
让我很困惑的是,为什么我可以通过上面的代码将OwnerCourseMixin
中的属性model = Course
转移到DeleteView
。它们之间没有直接的继承关系。这对我来说毫无意义。
您不会将 model
属性转移到 DeleteView
,而只是转移到 CourseDeleteView
,因为这是从 OwnerCourseMixin
继承的 class .
如果您实例化 DeleteView
,该实例将不会有 model = Course
,因为正如您巧妙地指出的那样,它们之间没有直接继承。但是,CourseDeleteView
的实例将具有 model = Course
,它继承自 OwnerCourseMixin
。
请参考以下代码:
from django.views.generic.edit import DeleteView
from .models import Course
class OwnerMixin(object):
def get_queryset(self):
qs = super(OwnerMixin, self).get_queryset()
return qs.filter(owner=self.request.user)
class OwnerCourseMixin(OwnerMixin):
model = Course
class CourseDeleteView(OwnerCourseMixin, DeleteView):
template_name = 'courses/manage/course/delete.html'
success_url = reverse_lazy('manage_course_list')
我很容易理解,通过在 CourseDeleteView
中添加 template_name
和 success_url
属性,我可以覆盖 DeleteView
中的属性。从而通过调用DeleteView
.
让我很困惑的是,为什么我可以通过上面的代码将OwnerCourseMixin
中的属性model = Course
转移到DeleteView
。它们之间没有直接的继承关系。这对我来说毫无意义。
您不会将 model
属性转移到 DeleteView
,而只是转移到 CourseDeleteView
,因为这是从 OwnerCourseMixin
继承的 class .
如果您实例化 DeleteView
,该实例将不会有 model = Course
,因为正如您巧妙地指出的那样,它们之间没有直接继承。但是,CourseDeleteView
的实例将具有 model = Course
,它继承自 OwnerCourseMixin
。