2010-03-05 108 views
5

有没有简单的方法可以做到这一点?在运行时设置模型字段选择属性?

+0

出于好奇,你有什么用途呢? – 2010-03-05 19:37:47

+0

我正在尝试从数据库中提取选择列表。我也在使用翻译,因为他们在数据库中,所以我不能标记翻译的字符串。 – 2010-03-08 14:50:21

+0

这些选择是暴露给用户还是仅用于内部逻辑?我想知道这是否可以在表单级别上处理,因为在那里动态地构造选择更为常见。改变模型层面的选择似乎无法摆脱首先在模型上设置选择的目的。也许这可以用不同的方式来解决? – 2010-03-08 16:14:53

回答

2

您可以设置选择属性可迭代: http://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.Field.choices

我没有测试此我自己,所以我不知道什么时候该选择属性是实际评估,但是你可以指定一个发电机函数可以计算出你想要的选择。

您可能还调查使用模型post_init信号:http://docs.djangoproject.com/en/1.1/ref/signals/#post-init

这会给你访问你的模型的Django已初始化后,等等,你可以在那时设置的选择。你可能想要通过如下所示的“_meta”界面:

instance._meta.get_field_by_name('FIELD_NAME')[0].choices = [<choices>...] 
+0

这几乎工作。我可以看到当前的选择,但如果我尝试将其设置为不同的值,则会出现以下错误:AttributeError:无法设置属性。 – 2010-03-05 18:37:24

+1

在字段来源中,您可以看到“选项”是只读属性: http://code.djangoproject.com/browser/django/tags/releases/1.1.1/django/db/models /fields/__init__.py#L296 尝试将设置改为“_choices”。这在shell中起作用,但我不会对意想不到的后果作任何保证。 – 2010-03-05 19:26:45

+0

是的!这对我行得通。谢谢一堆。 – 2010-03-05 19:43:33

1

设置选项in __init__()

+0

对不起,我不清楚。我的意思是在模型初始化后设置/更改选择属性。 – 2010-03-05 18:15:55