关于python:mixin对于django通用视图,对象如何具有超类?

Mixin for Django generic views, how can object have a superclass?

所以背景细节,post是一个模型,我基本上是想创建一个博客,和视频中显示的一样。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from django.views.generic import ListView, DetailView

from models import Post


class PublishedPostsMixin(object):
    def get_queryset(self):
        queryset = super(PublishedPostsMixin, self).get_queryset()
        return queryset.filter(published=True)


class PostListView(PublishedPostsMixin, ListView):
    # PostListView takes default template name as `post_list.html`,
    # as list was the name it was assigned.
    model = Post
    template_name = 'blog/post_list.html'                            


class PostDetailView(PublishedPostsMixin, DetailView):
    model = Post
    template_name = 'blog/post_detail.html'

所以,如果你能看到,PublishedPostsMixin是从对象继承的,那么super()是如何工作的。如果你能理解正在发生的事情,请你一步一步地解释,我有点困惑。


诀窍在于super所做的。这是一个动态调用:它指的是MRO(方法解析顺序)中的下一个类。因为(正如Adri_n在评论中所说)mixin只应该与其他类结合使用,所以mro中的PublishedPostsMixinobject之间总是有一些东西。

有关super的更多详细信息,您应该阅读Raymond Hettinger的文章super-considered super(注意,它是用python 3语法编写的,但原理是相同的)。