2011-08-24 10 views
1

我有一個表格覆蓋了init,因此我可以將某些複選框設置爲禁用,這些禁用的複選框已預先選中。爲表格覆蓋__init__並將複選框設置爲禁用並使用initial = True

class HomePhoneBundleOrderForm(forms.Form): 
def __init__(self, *args, **kwargs): 
    super(HomePhoneBundleOrderForm, self).__init__(*args, **kwargs) 
    self.fields['telephone_line'].widget.attrs['disabled'] = 'disabled' 
    self.fields['voice_mail'].widget.attrs['disabled'] = 'disabled' 

telephone_line = forms.BooleanField(initial=True, help_text="Local telephone line included.") 
voice_mail = forms.BooleanField(label="", help_text="Voicemail – included in this bundle.", initial=True) 

問題是,當我提出這種形式,即使它們是預先檢查,形式給我的錯誤,指出該字段爲必填字段,然後複選框選中變。你能給我一些幫助,爲什麼以及如何解決這個問題?

感謝

-J

回答

2

這裏的另一種選擇,這將適用於單形式以及表單集工作。 @sandinymyjoints鏈接到一個好帖子,並且被接受的答案肯定是經過深思熟慮的。但作爲一般規則,黑客請求參數可能會導致很多麻煩。作爲一個具體的例子,黑客攻擊formset提交涉及正則表達式,這真的很難看。在Formset中(記住它們是表單的集合),表單將以POST爲form-0-telephone_lineform-0-voice_mail等。試試這個。

在你的Form類中定義了兩個字段 - 一個看起來不錯的可見的字段和一個隱藏的字段來攜帶數據。可見覆選框將被禁用,因此永遠不會POST(正如你所知),但它會給用戶清晰的視覺指示。隱藏的複選框將保存您的初始True檢查狀態。

class HomePhoneBundleOrderForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     super(HomePhoneBundleOrderForm, self).__init__(*args, **kwargs) 
     self.fields['telephone_line_visible'].widget.attrs['disabled'] = 'disabled' 

    telephone_line = forms.BooleanField(initial=True, 
             widget=forms.HiddenInput) 
    telephone_line_visible = forms.BooleanField(initial=True, 
               required=False, 
               label="Telephone line", 
               help_text="Local telephone line included.") 

或者,如果你想保持「黑客」代碼完全在一個位置:

def __init__(self, *args, **kwargs): 
     super(HomePhoneBundleOrderForm, self).__init__(*args, **kwargs) 

     # Hack 
     self.fields['telephone_line'].widget=forms.HiddenInput() 
     self.fields['telephone_line_visible'] = forms.BooleanField(initial=True, 
                    required=False, 
                    label="Telephone line", 
                    help_text="Local telephone line included.") 
     self.fields['telephone_line_visible'].widget.attrs['disabled'] = 'disabled' 
+0

這個工程!謝謝! – JeffC

+0

@JeffC你介意給我一個+1嗎?這是適當的禮儀,upvote有用的答案。 – JCotton

0

我覺得你有同樣的問題,因爲這樣的:disabled field is not passed through - workaround needed

「既然要禁用窗口小部件,而不是場,至於形式擔心它永遠不會收到fieldA的信息,而且總是會失敗。「

有關可能的解決方案,請參閱該問題的接受答案。看起來像最好的一個涉及到修改POST以將所需的值放入字段中。

+0

貌似在我的例子唯一的解決辦法是由黑客request.POST,但是這是一個很大的醜陋的解決方案考慮到我有很多可能的選擇,self.instance hack可以工作,但假設我正在使用模型。這很醜陋,有沒有其他方法可以實現這一目標? – JeffC

0

您可以嘗試使用JavaScript/jQuery的,類似這種在提交前使他們在客戶端:

//enable disabled fields so they would get submitted with the request 
$('#form').submit(function() { 
    $('input,select', this).prop('disabled', ''); 
    return true; 
}); 
相關問題