4

次のフォームを定義しました

class MyForm(ModelForm):  
    def __init__(self, readOnly=False, *args, **kwargs):  
      super(MyForm,self).__init__(*args,**kwrds)  
      if readOnly:  
        Do stuff to make the inputs readonly

MyFormは、フォームとしてビューでインスタンス化すると完全に機能します
form = MyForm(readOnly=True, instance=ModelA)

しかし、inlineformset_factoryで使用しようとすると、
Formset = inlineformset_factory(ModelA, ModelB form=MyForm(readOnly=True))
「NoneTypeオブジェクトは呼び出せません」というエラーが表示されます。


これは、MyFormがインライン内で初期化されているため、モデルインスタンスなしでフォームが初期化されているためだと思います。


次のいずれかを実行すると同じエラーが発生するため 、インライン呼び出しでMyFormを使用する方法に問題があることはわかっています。

Formset = inlineformset_factory(ModelA, ModelB form=MyForm(readOnly=True))
Formset = inlineformset_factory(ModelA, ModelB form=MyForm())

しかし、私がそうすればそれは機能します
Formset = inlineformset_factory(ModelA, ModelB form=MyForm)

明らかに、readOnlyパラメーターのデフォルトはFalseであり、入力は変更されません。inlineformset_factoryを使用してreadOnlyパラメーターをMyFormに渡す方法、または他に必要なことを実現する方法を知っている人はいますか?

アンドリューありがとう

4

2 に答える 2

4

掘り下げてdjango.forms.modelsみると、インスタンスではなくinlineformset_factoryフォームクラスが必要であることがわかります。これが、最後の試行が機能し、他の試行が失敗する理由です...インスタンスを渡すことは機能しません。

これにより、探しているものが得られるはずです。

class MyReadOnlyForm(MyForm):

    def __init__(self, *args, **kwargs):
        super(MyReadOnlyForm,self).__init__(readOnly=True, *args,**kwargs)


Formset = inlineformset_factory(ModelA, ModelB form=MyReadOnlyForm)

両方のバージョンが必要な場合

if read_only is True:
    form_class = MyReadOnlyForm
else:
    form_class = MyForm 

Formset = inlineformset_factory(ModelA, ModelB form=form_class)
于 2009-10-23T05:25:59.177 に答える
1

ありがとう。私は別の投稿で次のことを見つけましたが、一方が他方よりも優れているかどうか疑問に思っていました.

Formset = inlineformset_factory(ModelA, ModelB form=MyForm)
Formset.form = staticmethod(curry(MyForm, reaOnly=readOnlyvalue))
myFormset = Formset(request.Files, instance=modelAInst)

于 2009-10-26T21:27:51.530 に答える