使用带有限制自定义管理器的admin list_editable
时,我遇到了一些奇怪的行为。每次我尝试在管理员中保存列表更改时,都会收到消息:请更正以下错误。
有关如何摆脱此错误消息的任何建议?
这是一个最小的样本:
models.py
from django.db import models
class RestrictedManager(models.Manager):
def get_queryset(self):
return super(RestrictedManager, self).get_queryset().none()
class MyModel(models.Model):
on = models.BooleanField()
objects = RestrictedManager()
all_objects = models.Manager()
admin.py
from django.contrib.admin import ModelAdmin, site
from models import MyModel
class MyModelAdmin(ModelAdmin):
list_editable = ('on',)
list_display = ('id', 'on',)
def get_queryset(self, request):
return MyModel.all_objects
site.register(MyModel, MyModelAdmin)
如果您想知道,为什么我使用none()
默认查询集,我不这样做。我只使用none()
来简化示例。任何由默认管理器过滤掉的对象都会出现此问题。
答案 0 :(得分:1)
我还没有测试过这个,但可能问题是,你已经覆盖了默认的管理器。
来自Django文档:Default managers
如果您使用自定义管理器对象,请注意第一个管理器Django遇到(按照它们在模型中定义的顺序)具有特殊状态。 Django将类中定义的第一个Manager解释为“默认”管理器,Django的几个部分(包括dumpdata)将专门为该模型使用该Manager。因此,在选择默认管理器时要小心谨慎,以避免重写get_queryset()导致无法检索您想要使用的对象。
首先使用“UnrestrictedManager”,然后使用自定义管理器作为第二个应该可以解决问题。
答案 1 :(得分:0)
我通过使用简单的管理器创建代理模型来解决这个问题。
class UnrestrictedMyModel(MyModel):
objects = models.Manager()
class Meta:
proxy = True
site.register(UnrestrictedMyModel, MyModelAdmin)
但我仍在寻找更好的解决方案。
答案 2 :(得分:0)
检查是否所有list_display
为list_editable
。
您可以:
list_editable
字段之一添加到list_display_links
来使其成为不可编辑的链接id
添加到list_display