最近我一直在玩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机制有关吗? 我正在寻找这种行为的解释。
谢谢!
答案 0 :(得分:0)
如果你问我,可以使用ForeignKey字段:
class CategoryModel(models.Model):
pass
class Category(models.Model):
model = models.ForeignKey(CategoryModel)
pass
如果您在管理面板中添加CategoryModel,您将能够随心所欲地添加/删除CategoryModel。
在Category模型表单中使用ForeignKey会显示SELECT输入。