【问题标题】:Django polymorphic admin list viewsDjango 多态管理列表视图
【发布时间】:2020-06-22 18:30:10
【问题描述】:

我的 Django 代码中有一个全局配置变量列表,其中一些是整数,一些是字符串。

我目前正在使用 django-polymorphic,这样基本模型具有名称,子模型具有值。

例如:

class Configuration(PolymorphicModel):
    name = models.CharField(max_length=128, unique=True)

    def __str__(self):
        return self.name


class ConfigurationInt(Configuration):
    value = models.IntegerField(default=0)

    def __str__(self):
        return f'{self.name} = {self.value}'


class ConfigurationStr(Configuration):
    value = models.CharField(max_length=256,default='')

    def __str__(self):
        return f'{self.name} = {self.value}'

然后将模型注册到管理部分,如下所示:

@admin.register(Configuration)
class ConfigurationAdmin(PolymorphicParentModelAdmin):
    list_display = ('__str__',)
    child_models = (ConfigurationInt, ConfigurationStr)


@admin.register(ConfigurationInt)
class ConfigurationIntAdmin(PolymorphicChildModelAdmin):
    base_model = ConfigurationInt


@admin.register(ConfigurationStr)
class ConfigurationStrAdmin(PolymorphicChildModelAdmin):
    base_model = ConfigurationStr

不幸的是,__str__ 部分仅在“配置”的共享列表视图中显示基类之一。 除了查看“ConfigurationInt”和“ConfigurationStr”的特定列表之外,无法以任何我能看到的方式访问该值。

有什么方法可以将它们实际列在一个不错的列表中吗?

假设我忘记了 django-polymorphic 并使用稀疏数据,这样每个配置都有一个整数和一个字符串,以及一些机制来说明它应该是什么,比如整数类型。 然后我可以在 __str__ 实现中显示正确的数据,但是在编辑时,它会同时显示两者。 在像这样的简单示例中这可能没问题,但是我也有更复杂的模型,它们具有广泛不同的领域,但在逻辑上都属于一个列表。 有没有办法在管理界面中隐藏/显示某些字段,例如在 list_display 和 list_editable 中,基于一个字段?

长话短说,有没有办法在管理界面中真正正确地实现多态列表? 让它在共享列表视图中可编辑会很棒,但即使只是实际显示信息,而只能在对象本身或特定列表中进行编辑,也会很好。

【问题讨论】:

    标签: python django django-models django-admin


    【解决方案1】:

    埋在polymorphic.admin.parentadmin.py的源代码里是这样的:

        #: Whether the list should be polymorphic too, leave to ``False`` to optimize
        polymorphic_list = False
    
        ...
    
        def get_queryset(self, request):
            # optimize the list display.
            qs = super(PolymorphicParentModelAdmin, self).get_queryset(request)
            if not self.polymorphic_list:
                qs = qs.non_polymorphic()
            return qs
    

    哪种有意义。看到您可能在那里显示 20 个项目,因此默认尝试优化它是有意义的。否则该页面超时的可能性太大。

    无论如何,我认为设置:

    polymorphic_list = True
    

    希望能为您解决这个问题:)

    实际上,它也在文档中,(在实现细节下):

    默认情况下,将在查询集上调用 non_polymorphic() 方法,因此只会将 Parent 模型提供给列表模板。这是为了避免检索子模型对性能的影响。

    这可以通过在父管理员上设置 polymorphic_list 属性来控制。将其设置为 True 将为列表模板提供子模型。

    【讨论】:

    • 非常感谢,这正是我想要的!我的数据集非常小,最大值在几十个范围内,所以我怀疑性能是否会很重要。
    • 是的,即使有 20 个,我认为大部分时间都可以。很高兴帮助:)
    猜你喜欢
    • 2016-04-27
    • 2016-03-10
    • 2019-06-23
    • 2021-04-30
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    相关资源
    最近更新 更多