2016-12-05 81 views
1

我有一個choicefield形式:Django形成ChoiceField:如何將數據屬性添加到輸入收音機?

class CheckoutForm(forms.Form): 
     shipping_method = forms.ChoiceField(widget=forms.RadioSelect) 

我如何添加數據屬性每一個選擇?喜歡的東西:

<ul id="id_shipping_method"> 
    <li> 
     <label for="id_shipping_method_0"> 
     <input class="form-control" id="id_shipping_method_0" name="shipping_method" type="radio" value="C" data-method="courier"> Express courier</label></li> 
    <li> 
     <label for="id_shipping_method_1"> 
     <input checked="checked" class="form-control" id="id_shipping_method_1" name="shipping_method" type="radio" value="yy" data-method="shop">In shop</label></li> 
</ul> 
+0

你問如何爲每個條目提供不同的'數據method'的?這些方法不應該是'價值'嗎? – Sayse

+0

不,因爲我需要數據屬性JS端:當我點擊收音機時,如果方法等於'手動',我必須禁用送貨地址。 我無法編輯值,因爲我不管理服務器端.. – user1518217

回答

1

編輯:重讀的問題,更新了幾件事

有點亂,但是這應該讓你在正確的軌道上。您需要重寫RadioSelect的一些渲染組件。

from django import forms 

CHOICES = (('C','Express courier'),('yy','In shop'), ('h','By hand')) 

class MyRadioChoiceInput(forms.widgets.RadioChoiceInput): 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     method = {'C': 'courier', 'yy': 'shop', 'h': 'hand'}.get(self.choice_value) 
     self.attrs['data-method'] = method 

class MyRadioFieldRenderer(forms.widgets.ChoiceFieldRenderer): 
    choice_input_class = MyRadioChoiceInput 

class MyRadioSelect(forms.RadioSelect): 
    renderer = MyRadioFieldRenderer 

class CheckoutForm(forms.Form): 
    shipping_method = forms.ChoiceField(choices=CHOICES, widget=MyRadioSelect(attrs={'class': 'form-control'})) 

例子:

a = CheckoutForm() 
for x in a: 
    print(x) 

結果:

<ul id="id_shipping_method"> 
<li><label for="id_shipping_method_0"><input class="form-control" data-method="courier" id="id_shipping_method_0" name="shipping_method" type="radio" value="C" /> Express courier</label></li> 
<li><label for="id_shipping_method_1"><input class="form-control" data-method="shop" id="id_shipping_method_1" name="shipping_method" type="radio" value="yy" /> In shop</label></li> 
<li><label for="id_shipping_method_2"><input class="form-control" data-method="hand" id="id_shipping_method_2" name="shipping_method" type="radio" value="h" /> By hand</label></li> 
</ul> 
相關問題