Django模型动态选择
最近我在玩Django 1.4.3(Python 2.7),我需要一个模型字段的选项能够动态加载。简单来说,我需要能够从某个地方注册一个可能的选择。
一开始我想:
这太简单了,Python是通过引用传递列表的。
结果并没有那么顺利……
以下是我找到的有效代码片段:
models.py
class CategoryModels:
def __init__(self):
self.category_models = [
['dummy', 'dummy']
]
def register(self, model, label=None):
if label == None:
label = model.split('.').pop()
self.category_models.append([model, label])
def get_models(self):
return self.category_models
category_models = CategoryModels()
class Category(models.Model):
MODEL_CHOICES = category_models.get_models()
name = models.CharField(blank=False, unique=True, max_length=30)
model = models.CharField(blank=False, max_length=30, choices=MODEL_CHOICES)
admin.py
import app
app.models.category_models.register('app.models.Entity')
app.models.category_models.register('app.models.OtherModel')
这个方法是有效的,但是……要注意,列表里有一个“虚拟”的条目。奇怪的是,如果没有这个“虚拟”条目,它就不工作了(你只会得到一个普通的输入框)。我已经对这个话题做了一些研究,发现了其他懒加载的解决方案等等。但这个方法似乎是最简单、最清晰的。我只是想知道,为什么没有这个“虚拟”条目就不行?为什么选项会是空的?如果你做一些像这样的事情:
def get_models(self):
return self.category_models.reverse()
这和Python或Django的机制有关吗?我想了解一下这种行为的原因。
谢谢!
1 个回答
0
如果你问我的话,使用 外键(ForeignKey) 字段是个不错的选择:
class CategoryModel(models.Model):
pass
class Category(models.Model):
model = models.ForeignKey(CategoryModel)
pass
在管理面板中添加分类模型后,你就可以随意添加或删除分类模型了。
在分类模型的表单中使用外键,会显示一个下拉选择框。