Django模型动态选择

1 投票
1 回答
1135 浏览
提问于 2025-04-17 15:50

最近我在玩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的机制有关吗?我想了解一下这种行为的原因。

谢谢!

1 个回答

0

如果你问我的话,使用 外键(ForeignKey) 字段是个不错的选择:

class CategoryModel(models.Model):
    pass


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

在管理面板中添加分类模型后,你就可以随意添加或删除分类模型了。

在分类模型的表单中使用外键,会显示一个下拉选择框。

撰写回答