2010-03-31 57 views
10

比方說,我使用的Django的網站模式:如何在Select小部件中使用模型對象構造Django表單?

class Site(models.Model): 
    name = models.CharField(max_length=50) 

我的網站值(鍵,值):

1. Stackoverflow 
2. Serverfault 
3. Superuser 

我想構建一個形式的HTML選擇控件與上述值:

<select> 
    <option value="1">Stackoverflow</option> 
    <option value="2">Serverfault</option> 
    <option value="3">Superuser</option> 
</select> 

我想用下面的代碼開始,但它是不完整的:

class SiteForm(forms.Form): 
    site = forms.IntegerField(widget=forms.Select()) 

任何想法,我可以用Django的形式實現嗎?

編輯

不同的頁面會呈現不同的網站值。開發頁面將顯示開發網站,而烹飪頁面將顯示配方網站。我基本上想要基於視圖動態地填充小部件選擇。我相信我現在可以通過在模板中手動生成html來實現這一目標。

回答

11

我認爲您正在尋找ModelChoiceField

更新:特別注意queryset的說法。在支持該頁面的視圖中,您可以根據您關心的任何標準更改您提供的QuerySet

+0

我可以在視圖中指定查詢集嗎? – 2010-03-31 20:22:16

+0

如同,提供'QuerySet'來使用每當你實例化你的'Form'?我不確定。如果你的可能性是有限的,那麼提供一個適合你正在使用的特定視圖的'Form'子類似乎相當簡單,例如'DeveloperSitesForm','EndUserSitesForm'等。 – 2010-03-31 20:33:39

+1

我能夠從代碼該問題:http://stackoverflow.com/questions/622982/django-passing-custom-form-parameters-to-formset – 2010-03-31 20:38:15

10

我沒有測試過這一點,但我想沿着線的東西...

site = forms.IntegerField(
    widget=forms.Select(
     choices=Site.objects.all().values_list('id', 'name') 
     ) 
    ) 

編輯 -

我只是嘗試了這一點,它不正確生成的選擇。該choices論點期待的2元組這樣的列表...

(
    (1, 'stackoverflow'), 
    (2, 'superuser'), 
    (value, name), 
) 

.values_list將返回只要你有ID和名稱/標題/無論作爲,因此精確的格式:.values_list('id', 'name')。當表格被保存時,.site的值將是所選站點的id/pk。

+0

這將在首次定義表單時評估網站查詢集。如果數據更改,表單將不會顯示新數據。 – 2010-03-31 21:43:15

相關問題