Mixin for Django通用视图,对象如何拥有超类?

时间:2013-05-29 15:42:27

标签: python django

所以背景细节,Post是一个模型,我基本上是在尝试创建一个博客,与此video中显示的博客相同。

以下是代码:

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()是如何工作的呢?如果你能理解发生了什么,请你一步一步解释,我有点困惑。

1 个答案:

答案 0 :(得分:3)

诀窍在于super。这是一个动态调用:它指的是MRO中的下一个类(方法解析顺序)。因为(正如Adrián在评论中所说)mixin只能与其他类一起使用,所以总是介于PublishedPostsMixinobject之间MRO。

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