最近、私は 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 のメカニズムと何か関係がありますか? 私はそのような行動の説明を探しています。
ありがとう!