【问题标题】:Mixin for Django generic views, how can object have a superclass?Mixin 用于 Django 通用视图,对象如何拥有超类?
【发布时间】:2013-05-29 15:42:27
【问题描述】:

所以背景细节,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() 是如何工作的。如果您能理解发生了什么,请您一步一步解释,我有点困惑。

【问题讨论】:

  • mixin 不应该单独使用。它仅在应用于定义get_queryset 方法的类时才有效。
  • @AdriánLópez:谢谢,我知道,但它是如何工作的。

标签: python django


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-10
    • 2012-06-29
    • 1970-01-01
    • 2016-07-10
    • 2012-12-31
    • 1970-01-01
    • 2016-03-08
    • 2014-01-08
    相关资源
    最近更新 更多