1

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

ありがとう!

4

1 に答える 1

0

あなたが私に尋ねた場合、 ForeignKeyフィールドを使用するのが道です:

class CategoryModel(models.Model):
    pass


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

管理パネルで CategoryModel を追加すると、CategoryModel を気まぐれに追加/削除できるようになります。

Category モデル フォームに ForeignKey があると、SELECT 入力が表示されます。

于 2013-02-14T02:38:33.350 に答える