1

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

首先我想:

呸,这很容易。Python 通过引用传递列表

事情并没有那么顺利……

以下是对我有用的片段:

模型.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)

管理员.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 回答