2009-08-12 114 views
2

我目前有一個問題,並可能忽略一些非常微不足道的事情。我的模型中有一個字段允許通過複選框表單進行多項選擇(它不必是管理員屏幕中的複選框,只是在最終用戶將看到的表單區域中)。目前我有這樣的現場設置:Django ModelForm CheckBox Widget

# Type of Media 
MEDIA_CHOICES = (
    ('1', 'Magazine'), 
    ('2', 'Radio Station'), 
    ('3', 'Journal'), 
    ('4', 'TV Station'), 
    ('5', 'Newspaper'), 
    ('6', 'Website'), 
) 
media_choice = models.CharField(max_length=25, 
    choices=MEDIA_CHOICES) 

我需要採取的是,並在其中形式的複選框可選字段。當我創建一個ModelForm時,它想要做一個下拉框。所以我自然而然地超越了這個領域,並且我得到了我想要的複選框。但是,當提交表單時,看起來管理員屏幕上看起來沒有任何用處。但數據庫確實顯示我選擇了很多東西,這是一個積極的信號。但是,如何才能在管理屏幕中正確反映這一點?

編輯:FWIW我很樂意接受文檔鏈接作爲答案,因爲它似乎我只是掩蓋了一些明顯的東西。

回答

15

在這種情況下,最簡單的方法是將選項放入單獨的模型中,然後使用ManyToMany關係。之後,您只需重寫該字段的ModelForm小部件即可使用forms.CheckboxSelectMultiple,Django將自動執行正確的操作。如果你堅持使用CharField,你可能需要做一些類似於this snippet的事情。

@ 2.評論:你是如何覆蓋小部件?這就是我的做法,它的工作原理非常完美:

class SomeModelForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(SomeModelForm, self).__init__(*args, **kwargs) 
     self.fields['some_field'].widget = forms.CheckboxSelectMultiple() 
+0

感謝您的提示。不想使用ManyToMany,因爲我會創建大約6個模型,以獲取永遠是靜態的信息。似乎沒有必要。 – f4nt 2009-08-12 20:32:40

+2

另外,fwiw,似乎沒有工作。當我使用CheckBoxSelectMultiple表單時,該字段呈現爲空白。如果我使用MultipleChoiceField,使用Checka工具,但只有當我提供一個選項列表。然後我必須使用overriden clean函數將數據映射回來。也許這是正確的方式,但它「感覺」是錯誤的,通常當「感覺」錯誤時,就是這樣。只是想驗證我在這裏沒有做得太過分。 – f4nt 2009-08-12 21:05:40

+0

嗯,我不這樣做是正確的,所以感謝設置我直在那裏,但現在我有這樣的: 在Models.py: MEDIA_TYPE = models.ManyToManyField(MediaChoice) 在Forms.py: 高清__init__ (self,* args,** kwargs): super(MediaContactForm,self).__ init __(* args,** kwargs) self.fields ['media_type']。widget = forms.CheckboxSelectMultiple() – f4nt 2009-08-12 21:39:25

1

我剛剛開始研究使用ModelForms進行小部件分配。在我見過的很多例子中,包含了piquadrat,Form的__ init __方法被覆蓋。

我覺得這是一個有點混亂,只是覆蓋所需場更加自然的對我來說:

class SomeModelForm(forms.ModelForm): 
    some_field = forms.CharField(choices=MEDIA_CHOICES, 
           widget=forms.CheckboxSelectMultiple) 
    class Meta: 
     model=SomeModel 

注:我使用Django 1.1。

0

使用piquadrat的答案爲我工作,但需要添加一行來定義M2M的查詢集。見this link