2010-03-05 109 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