2012-03-30 36 views
1

我有一個窗體,它是BaseInlineFormSet的子類,對於相關模型中的一個字段,我喜歡更改其窗口小部件。這裏是我的表單代碼:Django - 在BaseInlineFormSet的子類中更改字段的小部件

class MyForm(forms.models.BaseInlineFormSet): 
    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 

     self.forms[0].error_css_class = 'error' 
     self.forms[0].required_css_class = 'required' 

    class Meta: 
     model = MyModel 

     # here I am trying. 
     # recommend is an IntegerField in MyModel, which - 
     # I like to make it render in the form as a Radio Select (yes, no) 
     widgets = {'recommend': {forms.RadioSelect}} 

任何幫助和投入表示讚賞

+1

要啓動'BaseInlineFormSet'不使用內Meta類。 – 2012-03-30 15:43:08

回答

10

內聯表單集是模型形式的集合。 Meta類不屬於formset,它屬於模型表單。

通常,您可以使用inlineformset_factory方法創建內嵌窗體集類,該方法可以將form作爲參數。

class MyModelForm(forms.ModelForm): 
    class Meta: 
     model = MyModel 
     widgets = {'recommend': forms.RadioSelect()} 

MyModelFormSet = inlineformset_factory(ParentModel, MyModel, form=MyModelForm) 

如果你必須繼承BaseInlineFormset,可以提供表單集作爲參數傳遞給inlineformset_factory爲好。

查看inline formset文檔以獲取更多信息。

+0

我試過你的解決方案。我有兩個問題:1-當我排除MyModelForm中的Meta類中的字段時,除了Id之外,父字段(外部)總是出現在表單中。 2-我必須使用extra = 1,否則只有在顯式循環訪問模板中的可見字段時,表單纔會顯示 – blaise 2012-04-09 15:49:23

+0

,外來字段(鍵)消失。還有,額外= 1呢? – blaise 2012-04-09 16:46:47

+0

你沒有顯示你的模板,但它聽起來像你手動渲染表單集。外鍵是表單中的隱藏字段,因此您應該分開處理它。見例如https://docs.djangoproject.com/en/dev/topics/forms/?from=olddocs#looping-over-hidden-and-visible-fields。如果它與'extra = 1'一起工作,那麼我不確定問題是什麼? – Alasdair 2012-04-09 17:24:21

3

要合併部件在BaseInlineFormSet類.......

覆蓋「add_fields,傳入三個」方法在子類:

def add_fields(self, form, index): 
    super(MyForm, self).add_fields(form, index) 
    form.fields["recommend"].widget = forms.RadioSelect() 
相關問題