【问题标题】:Django admin list editDjango 管理员列表编辑
【发布时间】:2014-12-07 09:44:15
【问题描述】:

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

【问题讨论】:

  • 这似乎已经过时了,因为 django.contrib.admin 中不再有 ModelAdmin。

标签: python django django-forms django-admin


【解决方案1】:

我还没有对此进行测试,但问题可能是,您已经覆盖了默认管理器。

来自 Django 文档:Default managers

如果您使用自定义 Manager 对象,请注意 Django 遇到的第一个 Manager (按照它们在模型中定义的顺序)具有特殊状态。 Django 将类中定义的第一个管理器解释为“默认”管理器,并且 Django 的几个部分(包括转储数据)将专门为该模型使用该管理器。因此,最好谨慎选择默认管理器,以避免覆盖 get_queryset() 导致无法检索您想要使用的对象的情况。

因此,首先使用您的“UnrestrictedManager”,然后使用您的自定义管理器应该可以解决问题。

【讨论】:

  • 看来我的做法被 Django 劝阻了。谢谢!
【解决方案2】:

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

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

    class Meta:
        proxy = True

site.register(UnrestrictedMyModel, MyModelAdmin)

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

【讨论】:

    【解决方案3】:

    检查您是否将所有list_display 都设为list_editable。 你可以:

    1. 将其中一个list_editable 字段添加到list_display_links,使其成为不可编辑的链接
    2. id 添加到list_display

    【讨论】: