“list_editable”在管理更改列表视图中不起作用,使用自定义get_queryset()方法

时间:2017-01-30 13:08:02

标签: django django-admin

我在整个项目中使用自定义抽象模型和经理。

class BaseQueryset(models.QuerySet):

   pass


class BaseManager(models.Manager):
   queryset_class = BaseQueryset

    def get_queryset(self, exclude_no_published=True):
        """ exclude all objects with is_published=False by default """
        q = self.queryset_class(self.model)
        if exclude_no_published:
            q = q.exclude(is_published=False)
        return q

    def all_objects(self):
        """ allows geting all objects in admin """
        return self.get_queryset(exclude_no_published=False)


class BaseAbstractModel(models.Model):

    is_published = models.BooleanField(default=True)

    objects = BaseManager()

    class Meta:
        abstract = True

所有模型都继承自这个抽象模型,我需要一种方法来表示admin中的所有对象。所以我使用get_queryset方法

为管理类编写了自己的mixin
class AdminFullQuerysetMixin(object):

    def get_queryset(self, request):
    """
    Allows showing all objects despite on is_public=False
    """
        qs = self.model.objects.all_objects()
        ordering = self.get_ordering(request)
        if ordering:
            qs = qs.order_by(*ordering)
        return qs

我有一个典型的管理类:

@admin.register(SomeModel)
class SomeModelAdmin(AdminFullQuerysetMixin, admin.ModelAdmin):

    list_display = ('name', 'slug', 'is_published')
    list_filter = ('is_published',)
    list_editable = ('is_published',)

一切正常,我可以看到管理员中的所有对象是否为is_published False或True。但是当我在管理对象列表页面中使用它时,list_filterlist_editable等属性不起作用。没有例外,只是列表顶部的文字:“请更正下面的错误” 我应该覆盖除get_queryset以外的哪些方法来解决我的问题?

1 个答案:

答案 0 :(得分:1)

您可能需要read this

  

如果使用自定义Manager对象,请注意第一个Manager   Django遇到(按照模型中定义的顺序)   有特殊的地位。 Django解释了a中定义的第一个Manager   class作为“默认”管理器,以及Django(...)的几个部分   将该Manager专门用于该模型。结果,它是一个   最好小心选择默认管理器   避免重写get_queryset()导致的情况   无法检索您想要使用的对象

我强烈怀疑你遇到其中一个案件......

然后解决方案是将您的模型更改为:

class BaseAbstractModel(models.Model):

    is_published = models.BooleanField(default=True)

    # this one will be the default manager
    all_objects = models.Manager()

    # and this one will be known as 'objects' 
    objects = BaseManager()

    class Meta:
        abstract = True

然后你可以删除你的AdminFullQuerysetMixin(或者重写它的get_queryset()方法来代替使用self.model._default_manager

注意:我当然可能错了,问题完全无关;)