2013-02-14 97 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