2013-02-14 53 views
1

最近我一直在玩Django 1.4.3(Python 2.7),我需要一个模型字段来让它的选择动态加载。 基本上,我需要从某处注册可能的选项的可能性。Django模型的动态选择

首先我想:

巴阿,这会是容易的。 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

“it break”是什么意思?给我们完整的python错误。 – rantanplan 2013-02-14 12:56:20

+0

你只是得到一个常规的输入字段。就好像选择参数是空的。 – 2013-02-14 13:13:52

+0

您的反向示例包含一个错误,因为reverse()返回None。应该是:“return reversed(self.category_models.reverse())” – 2015-02-11 14:49:37

回答

0

使用ForeignKey场是要走的路,如果你问我:

class CategoryModel(models.Model): 
    pass 


class Category(models.Model): 
    model = models.ForeignKey(CategoryModel) 
    pass 

如果您在管理面板中添加CategoryModel,你就可以添加/删除CategoryModels心血来潮。

在类别模型窗体中拥有一个ForeignKey将显示一个SELECT输入。

+0

这是我已经想到的事情之一,但我的方法适用于我,因为我可以用实际数据替换虚拟条目。我不认为需要将它保存在数据库中,因为它似乎太多了。就像我说的,我正在寻找这个奇怪行为的解释。 – 2013-02-14 10:36:42