首页 > 解决方案 > 如何在我的程序中添加一个包含所有不同类型模型的下拉框?

问题描述

我想要一个包含我程序中所有模型的下拉框。

我制作了一个 charfield 为 100 的 myModels 模型。我尝试添加选择元组,然后在模型中引用它。

    helper_choices = []
    for my_model in django.apps.apps.get_models():
        helper_choices.append((my_model._meta.verbose_name, my_model._meta.verbose_name))
    MODEL_CHOICES = tuple(helper_choices)
    model_name = models.CharField(max_length=100, choices=MODEL_CHOICES, default='')

但是,由于这是在加载模型阶段发生的,因此出现错误“模型尚未加载”。这个问题的解决方法是什么?

标签: djangodjango-modelsdropdown

解决方案


确实不可能django.apps.apps.get_models()从模块的顶层调用models,因为模型的注册表当前正在填充。这将创建一个无限递归。

此外,在模型级别定义的选择在迁移中被冻结,因此每次您的模型列表更改时,您都需要迁移。

最后,您可能想要处理“遗留”模型的情况 - 如果您从项目中删除模型,指向它的记录将不再有效。

我还注意到您以

我想要一个包含我程序中所有模型的下拉框。

所以它看起来更像是为了 UI 目的?

无论如何:简单的解决方案是将choices参数排除在模型之外,仅在需要此模型选择的形式中指定它。您可能还希望使用规范app_label.model_name作为有效值,并且只使用详细名称进行显示(除非您不关心有不可用的数据)。


推荐阅读