2014-12-07 88 views
3

当管理员list_editable与限制自定义管理器一起使用时,我遇到了一些奇怪的行为。每次尝试保存管理员列表中的更改时,都会收到以下消息:请更正以下错误。Django管理员列表编辑

有关如何摆脱此错误消息的任何建议?

下面是一个最小的例子:

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()来简化示例。任何由默认管理器过滤掉的对象都会出现问题。

回答

1

我还没有测试过,但可能问题是,你已经覆盖了默认管理器。

从Django文档:Default managers

如果使用自定义Manager对象,请注意该第一个Manager Django遇到(在其中他们在模型中定义的顺序)有着特殊的地位。 Django将类中定义的第一个Manager解释为“默认”管理器,并且Django的多个部分(包括dumpdata)将专门为该模型使用该管理器。因此,在选择默认管理器时要小心,以避免覆盖get_queryset()导致无法检索想要使用的对象的情况。

所以首先使用你的“UnrestrictedManager”,你的自定义管理器作为第二个应该做的伎俩。

+0

Django似乎不鼓励我的方法。谢谢! – Yossi 2015-05-06 08:05:38

0

我通过使用简单的管理器创建代理模型来解决此问题。

class UnrestrictedMyModel(MyModel): 
    objects = models.Manager() 

    class Meta: 
     proxy = True 

site.register(UnrestrictedMyModel, MyModelAdmin) 

但我仍在寻找更好的解决方案。