2009-10-23 50 views
4

表單定義將自定義表單參數FORMSET

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

通過django.forms.models挖你可以看到,inlineformset_factory需要一個形式,不是一個實例。這就是爲什麼你的最後一次嘗試工作,另一個失敗......在一個實例中傳遞將無法正常工作。如果您需要兩個版本

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

Formset = inlineformset_factory(ModelA, ModelB form=form_class) 
+0

這將迫使我總是有readOnly的爲真,我的壞了道路II寫下上面的代碼。我希望readOnly的值可以是True或False,並且表單可以相應地工作。 (FormA = ModelB form = MyForm(readOnly = readONlyValue))' – 2009-10-26 01:15:53

+0

您仍然可以使用這種模式......查看我更新的答案。 – brianz 2009-10-26 15:53:27

1

感謝

class MyReadOnlyForm(MyForm): 

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


Formset = inlineformset_factory(ModelA, ModelB form=MyReadOnlyForm) 

這應該給你你在找什麼。我在另一篇文章中發現了以下內容,並且想知道其中一個比另一個更好。

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