Django管理列表编辑

时间:2014-12-07 09:44:15

标签: python django django-forms django-admin

使用带有限制自定义管理器的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()来简化示例。任何由默认管理器过滤掉的对象都会出现此问题。

3 个答案:

答案 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_displaylist_editable。 您可以:

  1. 通过将list_editable字段之一添加到list_display_links来使其成为不可编辑的链接
  2. id添加到list_display