2012-03-30 12 views
1

私はBaseInlineFormSetのサブクラスであるフォームを持っています。関連モデルのフィールドの1つとして、そのウィジェットを変更したいと思います。ここでは、フォームのための私のコードは次のとおりです。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'はインナーを使用していません: –

答えて

10

を高く評価され、インラインフォームセットは、モデルフォームのコレクションです。 Metaクラスはformsetに属しておらず、モデルフォームに属しています。

通常、を引数として使用できるinlineformset_factoryメソッドを使用して、インラインformsetクラスを作成します。あなたがBaseInlineFormsetをサブクラス化する必要がない場合は

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

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

は、あなたにも inlineformset_factoryへの引数としてフォームセットを提供することができます。

詳細については、inline formsetのドキュメントをご覧ください。

def add_fields(self, form, index): 
    super(MyForm, self).add_fields(form, index) 
    form.fields["recommend"].widget = forms.RadioSelect() 
+0

私はあなたの解決策を試しました。私は2つの問題を抱えています.1つは、MyModelForm内のMetaクラスのフィールドを除外するときに、親フィールド(外部)がIdに加えて常にフォームに表示されます。 2 - 余分な= 1を使用する必要があります。それ以外の場合は、テンプレート内の表示されているフィールドを明示的にループし、外部フィールド(キー)が消える場合にのみ、フォームに – blaise

+0

が表示されません。まだ、余分な= 1はどうですか? – blaise

+0

テンプレートは表示されていませんが、手動でフォームセットをレンダリングしているようです。外部キーはフォーム内の非表示フィールドなので、個別に扱う必要があります。例えば、 https://docs.djangoproject.com/ja/dev/topics/forms/?from=olddocs#looping-over-hidden-and-visible-fields。 'extra = 1'で動作するなら、問題は何か分かりません。 – Alasdair

3

は、あなたのサブクラスで....... BaseInlineFormSetクラスで

オーバーライド「add_fields」メソッドをウィジェットを組み込むために、 `メタ`クラス。

関連する問題