Python Django管理员列表编辑
我在对自定义管理器使用adminPython Django管理员列表编辑,python,django,django-forms,django-admin,Python,Django,Django Forms,Django Admin,我在对自定义管理器使用adminlist\u editable时遇到了一些奇怪的行为。每次我试图在admin中保存列表更改时,我都会收到一条消息:请更正下面的错误 关于如何消除此错误消息,有什么建议吗 以下是一个最小的示例: 型号.py from django.db import models class RestrictedManager(models.Manager): def get_queryset(self): return super(RestrictedM
list\u editable
时遇到了一些奇怪的行为。每次我试图在admin中保存列表更改时,我都会收到一条消息:请更正下面的错误
关于如何消除此错误消息,有什么建议吗
以下是一个最小的示例:
型号.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()
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)
admin.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()
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()
defaultqueryset,我没有。我使用none()
只是为了简化示例。默认管理器过滤掉的任何对象都会出现此问题。我通过使用简单管理器创建代理模型解决了此问题
class UnrestrictedMyModel(MyModel):
objects = models.Manager()
class Meta:
proxy = True
site.register(UnrestrictedMyModel, MyModelAdmin)
但是我仍然在寻找更好的解决方案。我还没有测试过这个,但问题可能是,您已经覆盖了默认的管理器 从Django文档: 如果使用自定义管理器对象,请注意第一个管理器Django遇到的对象(按照它们在模型中定义的顺序)具有特殊状态。Django将类中定义的第一个管理器解释为“默认”管理器,Django的几个部分(包括dumpdata)将专门为该模型使用该管理器。因此,在选择默认管理器时要小心,以避免覆盖get_queryset()导致无法检索您想要使用的对象的情况
因此,首先使用您的“无限制管理器”,然后使用您的自定义管理器应该可以实现这一目的。检查您是否将所有的
列表显示为可编辑的。
你可以:
将一个list\u editable
字段添加到list\u display\u links
将id
添加到列表\u显示中
看来我的方法被Django阻止了。谢谢这似乎已经过时了,因为django.contrib.admin中不再有ModelAdmin。