django - 如何在我的程序中添加一个包含所有不同类型模型的下拉框?
问题描述
我想要一个包含我程序中所有模型的下拉框。
我制作了一个 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='')
但是,由于这是在加载模型阶段发生的,因此出现错误“模型尚未加载”。这个问题的解决方法是什么?
解决方案
确实不可能django.apps.apps.get_models()
从模块的顶层调用models
,因为模型的注册表当前正在填充。这将创建一个无限递归。
此外,在模型级别定义的选择在迁移中被冻结,因此每次您的模型列表更改时,您都需要迁移。
最后,您可能想要处理“遗留”模型的情况 - 如果您从项目中删除模型,指向它的记录将不再有效。
我还注意到您以
我想要一个包含我程序中所有模型的下拉框。
所以它看起来更像是为了 UI 目的?
无论如何:简单的解决方案是将choices
参数排除在模型之外,仅在需要此模型选择的形式中指定它。您可能还希望使用规范app_label.model_name
作为有效值,并且只使用详细名称进行显示(除非您不关心有不可用的数据)。
推荐阅读
- html - 为什么文本居中时不显示我的文本?
- java - 以二叉搜索树格式存储数据的硬拷贝
- java - Spring依赖会导致内存问题吗?
- c# - 如何在运行时 SpecFlow 和使用 Nunit 的 C# 期间忽略验收测试?
- java - 如何在 Lucene 的 IR 模型中添加位置信息?
- javascript - React.JS 重新加载组件的问题
- android - AudioManager 中的函数 setParameter
- download - Youtube-dl - 在一个命令中一次下载多个 youtube 视频
- asp.net-core - SignalR 发送与调用
- c# - 访问数据表单元格值的歧义