【发布时间】:2017-06-15 15:48:00
【问题描述】:
我在整个项目中使用自定义抽象模型和经理。
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,我都可以在admin 中看到所有对象。但是当我在管理对象列表页面中使用它时,像list_filter 或list_editable 这样的属性不起作用。没有提供任何例外,只是列表顶部的文字:“请更正以下错误”。
除了get_queryset,我应该重写哪些方法来解决我的问题?
【问题讨论】:
-
请为您的管理类添加代码
-
@ResleyRodrigues 问题已更新,但管理员中没有这样的逻辑。我的 mixin 中
get_queryset的所有问题,没有那个 mixin 都可以正常工作,但我看不到is_published=False的对象,因为 Django 使用我的自定义查询集 -
我不确定出了什么问题,但另一种方法是在您的经理 (
.published()) 中使用自定义查询集并在需要时使用它,让管理员使用.all()。这样你就不需要 AdminFullQuerysetMixin 也不需要all_objects() -
@ResleyRodrigues 你是对的,但在这种情况下,我需要在任何地方调用
published(),而不是在管理员中的一个地方,因为默认情况下我不需要带有is_published=False的项目
标签: django django-admin