2010-02-10 7 views
18

J'ai un formulaire dynamique dans les formulaires. Comment puis-je passer un argument de mon point de vue lorsque j'instancie mon formulaire?passer des arguments à un formulaire dynamique dans django

Quelque chose comme:

form = DynamicForm("some string argument I'm passing to my form") 

C'est la forme que j'ai:

class DynamicForm(Form): 
def __init__(self, *args, **kwargs): 
    super(DynamicForm, self).__init__(*args, **kwargs) 
    for item in range(5): 
     self.fields['test_field_%d' % item] = CharField(max_length=255) 

Répondre

44

Ajoutez comme argument mot-clé, dire qu'il appelle my_arg. Assurez-vous de pop() le mot-clé arg avant d'appeler super(), car la méthode init de la classe parente n'accepte pas les arguments de mots-clés supplémentaires.

class DynamicForm(Form): 
    def __init__(self, *args, **kwargs): 
    my_arg = kwargs.pop('my_arg') 
    super(DynamicForm, self).__init__(*args, **kwargs) 
    for item in range(5): 
     self.fields['test_field_%d' % item] = CharField(max_length=255) 

Et lorsque vous créez la forme, il est comme ceci:

form = DynamicForm(..., my_arg='value') 
+9

Juste pour une note, lors de l'apprentissage sur les '** kwargs' .. je recevais toujours erreur comme:' __init __() a obtenu un argument de mot clé inattendu 'my_arg''. U devez '.pop' vos arguments en première ligne de votre constructeur ou au moins cela m'a aidé à résoudre mes problèmes. – krizajb

+0

Je veux pouvoir hériter de DynamicForm donc j'ai une classe Form de base que je peux transmettre des paramètres personnalisés. Pouvez-vous donner un exemple? – heri0n

+7

@krizajB en fait, vous devez kwargs.pop avant super(), sinon la classe de base recevra des arguments qu'elle ne supporte pas. Mais il ne doit pas être la * première * ligne. – thnee

Questions connexes