2011-12-12 74 views
0

我有一個分組類別字段。問題是我創建了一個搜索表單,但是當我嘗試在模板中將表單呈現給用戶時,它出錯了。帶有分組選擇字段的模板中的ModelForm

models.py

MEDIA_CHOICES = (
    ('Audio', (
     ('vinyl', 'Vinyl'), 
     ('cd', 'CD'), 
    ) 
    ), 
    ('Video', (
     ('vhs', 'VHS Tape'), 
     ('dvd', 'DVD'), 
    ) 
    ), 
    ('unknown', 'Unknown'), 
) 

category = models.CharField(max_length=20, choices=MEDIA_CHOICES, verbose_name=_(u'Category')) 

forms.py(搜索)

class SearchingForm(forms.Form): 

    "Search Box" 
    search = forms.CharField(max_length=100, required=False, label=(_(u'Search'))) 

    music_kind = forms.MultipleChoiceField(choices=MEDIA_CHOICES, required=False, 
             label=(_(u'Kind')),  
             widget=forms.CheckboxSelectMultiple(), 
             ) 

template.html

{{ form.search }} 
    {{ form.place_kind }} 

我展示的形式這樣的用戶,這個問題是當我用瀏覽器渲染時,我有這樣的東西(每行都有一個複選框):

(('vinyl', 'Vinyl'), ('cd', 'CD')) 
(('vhs', 'VHS Tape'), ('dvd', 'DVD')) 
Unknown 

我已經刪除了'widget = forms.CheckboxSelectMultiple()'屬性,但是我沒有複選框。那麼,我怎樣才能用複選框字段呢?

回答

1

我想你在這裏有一個數據類型不匹配。您想要將多個值存儲在單個CharField中。當然,你可以在那裏保存一個鍵值對的字典,但是你必須把它解析回選擇,這是一個巨大的痛苦。

我會將您的MEDIA_CHOICES移動到數據庫表中,然後在您的SearchingForm中,您可以執行CheckboxSelectMultiple,並且表單將按預期工作。

+0

這是一個好主意,但我如何從數據庫中恢復數據。這應該在視圖中完成,作爲對數據庫的查詢? – beni

+0

您需要使用ModelMultipleChoiceField,它具有queryset屬性來保存選項。然後,您可以使用CheckboxSelectMultiple來覆蓋該小部件。 – Brandon

1

我不確定,但不知道選擇組是否僅適用於選擇框(而不是複選框)。

+0

是的,只適用於選擇框,但我試圖重用代碼。在這種情況下,我應該重寫另一個選擇字段。 – beni