2010-03-24 6 views
6

La bibliothèque de formulaires de Django possède une fonction d'ensembles de formulaires qui vous permettent de traiter dynamiquement les formulaires ajoutés. Par exemple, vous utiliseriez des jeux de formulaires si votre application possède une liste de marque-pages que vous pouvez utiliser pour définir plusieurs formulaires représentant chacun un marque-page.Stockage des champs dynamiques dans les formulaires Django

Qu'en est-il si vous souhaitez ajouter dynamiquement un champ à un formulaire? Un exemple serait une page de création d'enquête où vous pouvez ajouter dynamiquement un nombre illimité de questions. Comment gérez-vous cela dans Django?

Répondre

7

Regardez ce post récent de Jacob Kaplan-Moss, l'un des fondateurs de Django: "Dynamic form generation". Il utilise un exemple pour vous montrer le processus étape par étape. Bonne lecture.

Il existe également a 2008 article by James Bennett, le gestionnaire de versions de Django.

5

Pour ajouter, supprimer et modifier des champs sur un formulaire ou ModelForm, juste passer outre __init__() comme ceci:

class MyForm(forms.Form): 
def __init__(self, *args, **kwargs): 
    user = kwargs.pop('user') 
    other_stuff = kwargs.pop('stuff') 

    super(MyForm, self).__init__(*args, **kwargs) 

    self.fields['my_dynamic_field'] = forms.Field(...) 

    # Add fields based on user or other_stuff 

Et l'utiliser comme ceci: form = MyForm(user = user, stuff = stuff)

+0

Note: Je ne peux pas envoyer l'utilisateur kwarg à super __init__; raise "__init __() a un argument de mot clé inattendu 'user'" – ecdani

+0

Résolu: kwargs.pop doit venir avant le super appel – ecdani

5

En python vous pouvez instancier une classe dynamique. knutin montre un bon exemple de personnalisation dynamique d'un formulaire basé, et en ajoutant quelques champs.

Vous pouvez également créer toute la forme dynamique, tirée du example given by James Bennett:

def make_contact_form(user): 
    fields = { 'name': forms.CharField(max_length=50), 
      'email': forms.EmailField(), 
      'message': forms.CharField(widget=forms.Textarea) } 
    if not user.is_authenticated(): 
    fields['captcha'] = CaptchaField() 
    return type('ContactForm', (forms.BaseForm,), { 'base_fields': fields }) 
Questions connexes