2009-10-23 8 views
4

Je le formulaire ci-dessous définipassage de paramètre formulaire personnalisé à 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 

MonFormulaire fonctionne parfaitement quand j'instancier dans la vue comme une forme
form = MyForm(readOnly=True, instance=ModelA)

mais lorsque je tente de l'utiliser dans le inlineformset_factory
Formset = inlineformset_factory(ModelA, ModelB form=MyForm(readOnly=True))
Je reçois l'erreur "objet NoneType n'est pas appelable".

Je pense que cela parce que la forme est initialisée sans une instance de modèle
parce MonFormulaire est initialisés dans le inline

Je sais que le problème est la façon dont je me sers du MonFormulaire dans l'appel en ligne
parce que je reçois la même erreur si je fais une des opérations suivantes

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

mais cela fonctionne si je le fais
Formset = inlineformset_factory(ModelA, ModelB form=MyForm)

évidemment le readOnly param par défaut à False et mes entrées ne sont pas modifiées. Est-ce que quelqu'un sait comment je peux passer le paramètre readOnly à MyForm en utilisant inlineformset_factory ou comment puis-je obtenir ce que je veux?

Merci Andrew

Répondre

4

En fouillant dans django.forms.models vous pouvez voir que inlineformset_factory a besoin d'une forme classe, pas une instance. C'est pourquoi votre dernier essai fonctionne et l'autre échoue ... le passage dans une instance ne fonctionnera pas.

Cela devrait vous donner ce que vous cherchez:

class MyReadOnlyForm(MyForm): 

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


Formset = inlineformset_factory(ModelA, ModelB form=MyReadOnlyForm) 

Si vous avez besoin des deux versions

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

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

Cela me forcera à avoir toujours readOnly comme vrai, mon mauvais pour la façon dont iI a écrit le code ci-dessus. Je voudrais que la valeur readOnly soit True ou False et que la forme fonctionne en conséquence. 'Formset = inlineformset_factory (ModèleA, ModelB form = MyForm (readOnly = readONlyValue)) ' –

+0

Vous pouvez toujours utiliser ce modèle ... voir ma mise à jour. – brianz

1

Merci. J'ai trouvé ce qui suit dans un autre post et je me demandais si l'un était meilleur que l'autre.

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

Questions connexes