2012-03-27 60 views
1

我想要一個表格有一個區域的下拉列表,根據其他一些數據預選其中一個區域。爲了使一個區被選中,我需要初始設置是這樣的:試圖獲得下拉選擇Form.initial

class myExtendedContactInfoForm(ExtendedContactInfoForm): 
    districts = [(x.id, x.district) for x in District.objects.all()] 
    district = forms.ChoiceField(choices=districts, required=False, initial=2) 

如果我實例myExtendedContactInfoForm 沒有設置初始,下拉完美的作品:

form = myExtendedContactInfoForm(contact=contact) 

但是,對於其餘的表單來說,我實際上需要通過初始的數據,所以我mus t這樣做:

form = myExtendedContactInfoForm(contact=contact, initial=init_data) 

但是,這使得在下拉停止工作的選擇。原因在文檔中解釋。它說,在Django的docs

注意,如果一個字段定義初始和你包括初始實例化窗體時,那麼後者最初將具有優先權。

我該如何解決這個問題?這有點像名稱空間污染。

非常感謝, 托馬斯

回答

2

喜歡的東西:

class myExtendedContactInfoForm(ExtendedContactInfoForm): 
    def __init__(self, *args, **kwargs): 
     if 'initial' in kwargs: 
      kwargs['initial']['district'] = 2 
     super(myExtendedContactInfoForm, self).__init__(*args, **kwargs) 
+0

做kwargs.update({'initial':{'district':2}})會更好嗎?例如如果沒有設置kwargs ['initial'] – jpic 2012-03-27 09:40:00

+0

@jpic不,'{'initial':{'a':1,'b':2}}。update({'initial':{'district':2 – DrTyrsa 2012-03-27 09:47:45

0
class myExtendedContactInfoForm(ExtendedContactInfoForm): 

    def __init__(self, *args, **kwargs): 
     super(myExtendedContactInfoForm, self).__init__(*args, **kwargs) 
     self.fields['district'].initial = 2   

    districts = [(x.id, x.district) for x in District.objects.all()] 
    district = forms.ChoiceField(choices=districts, required=False) 
+0

爲什麼不使用forms.ModelChoiceField(queryset = District.objects.all())? – jpic 2012-03-27 09:39:36

+2

將不起作用,表單的初始[always always precedence](https://code.djangoproject。com/browser/django/trunk/django/forms/forms.py#L489)。 – DrTyrsa 2012-03-27 09:40:28

+0

好點,無論如何我都會在這裏留下 - 很好看看它爲什麼不起作用 – 2012-03-27 09:42:07

3

作爲替代覆蓋表單的__init__方法,你可以從表單刪除的init_datadistricts關鍵。這樣,其他字段將從表單的初始數據填充,並且districts字段使用其自己的初始值。

init_data.pop('districts', None) 
form = myExtendedContactInfoForm(contact=contact, initial=init_data) 
0

我更喜歡指定選擇不同的方式:

class MemberForm(forms.Form): 
    google_account = forms.EmailField() 
    group = forms.ChoiceField() 

    def __init__(self, *args, **kwargs): 
     super(MemberForm,self).__init__(*args, **kwargs) 
     self.fields['group'].choices = [(g.id,g.name) for g in get_group_choices()] 

哪裏get_group_choices()做所有的DATABSE查詢等。顯然,你可以做的查詢中__init__,它基本上下降到風格在這一點上。

使用這種方法,我從來沒有問題的初始值。

編輯:不知何故,我完全誤讀了一個事實,即您試圖將初始值硬編碼到表單中。你能否將初始值硬編碼到你的視圖中?

+0

我實際上並不想硬編碼值2.我只是爲了簡潔而寫的。實際上它會基於其他一些設置。 – handros 2012-03-27 10:35:26

+0

無論哪種方式,我的首選方法是將該值傳遞給視圖中的初始值:'f = ContactForm(initial = {'myfield':myvalue})'。有沒有理由爲什麼這不起作用? – Elliott 2012-03-30 20:08:08