2009-10-20 111 views
6

之間仍然存在在某些時候我需要顯示​​類型的"disabled"(由disabled="disabled"屬性灰色)輸入。如標準(xhtml和html4)中所述,​​類型的輸入不能具有"readonly"屬性。請注意,這僅用於演示目的,實際值必須在POST中結束。因此,這裏是我做(報價在Django的形式聲明的一部分):Django表單:使禁用字段驗證

from django import forms 

_choices = ['to be', 'not to be'] 
class SomeForm(forms.Form): 
    field = forms.ChoiceField(choices=[(item, item) for item in _choices], 
        widget=forms.HiddenInput()) # the real field 

    mock_field = forms.ChoiceField(required=False, # doesn't get submitted 
         choices=[(item, item) for item in _choices], 
         label="The question", 
         widget=forms.Select(attrs={'disabled':'disabled'})) 

它被初始化這樣的:

initial_val = 'to be' 
form = SomeForm(ititial={'field':initial_val, 
         'mock_field':initial_val}) 

,一切都很好。那麼,直到表單得到驗證,並且其他字段之一未通過驗證。發生這種情況時,表單將被重新加載並保存值,但不是「mock_field」 - 它從未提交過(它被禁用)。所以它不被保存。雖然這不影響數據的完整性,但它仍然不是很好的演示方式。

有沒有什麼方法可以保留這個領域,儘可能少用駭客?該表格是django.contrib.formtools.FormWizard的一部分,並且初始值(和一些字段)是動態生成的。基本上,已經有很多事情在發生,如果有可能不會讓事情過度複雜化,那將會很棒。

回答

1

那麼,這將是我第一次回答我的問題,但我已經找到了一個解決方案,(雖然它總之是一個黑客)它的工作原理。

而不是從窗體實例獲取初始值, - self.fields['whatever'].initial似乎是None裏面的構造函數,我從關鍵字參數「初始」獲取值。然後我將其設置爲「模擬」字段的唯一選擇。像這樣:

from django import forms 

_choices = ['to be', 'not to be'] 
class SomeForm(forms.Form): 
    field = forms.ChoiceField(choices=[(item, item) for item in _choices], 
        widget=forms.HiddenInput()) # the real field 

    mock_field = forms.ChoiceField(required=False, # doesn't get submitted 
         choices=[(item, item) for item in _choices], 
         label="The question", 
         widget=forms.Select(attrs={'disabled':'disabled'})) 

    def __init__(self, *args, **kwargs): 
     super(SomeForm, self).__init__(*args, **kwargs) 
     mock_initial = kwargs['initial']['field'] 
     self.fields['mock_field'].choices = [(mock_initial, mock_initial),] 

這可能需要一些錯誤處理。顯然,如果沒有爲實際的field提供初始值,這將不起作用。

3

瀏覽器不POST發佈禁用字段。

你可以嘗試field的初始值複製到mock_field在窗體的__init__

def __init__(self, *args, **kwargs): 
    super(SomeForm, self).__init__(*args, **kwargs) 
    mock_initial = self.fields['field'].initial 
    self.fields['mock_field'].initial = mock_initial 

代碼沒有進行測試。通常你會關心form.data爲好,但在這種情況下,它不會是不同於initial

+0

嗯,我當然知道禁用的字段不會發布(因爲只有成功的控件纔會發佈,禁用的字段永遠不會成功)。我現在要測試你的方法。它看起來相當有說服力。 – shylent 2009-10-21 07:36:37