2010-07-14 1 views
2

J'ai une forme le long des lignes de:Est-il possible d'ajouter une seule ligne à un formulaire Django?

class aForm(forms.Form): 
    input1 = forms.CharField() 
    input2 = forms.CharField() 
    input3 = forms.CharField() 

Ce que j'espère faire est d'ajouter un ENTRÉE3 supplémentaire à la forme lorsque l'utilisateur clique sur un « ajouter un autre ENTRÉE3 ».

J'ai lu un tas de façons qui me permettent d'ajouter de nouvelles formes en utilisant des formsets, mais je ne veux pas ajouter un nouveau formulaire, je veux juste ajouter une nouvelle entrée3.

Est-ce possible?

Répondre

2

pour ajouter des champs dynamiques remplacer la méthode init.

Quelque chose comme ceci:

class aForm(forms.Form): 
    input1 = forms.CharField() 
    input2 = forms.CharField() 

    def __init__(self, addfields=0, *args, **kwargs): 
    super(aForm, self).__init__(*args, **kwargs) 

    #add new fields 
    for i in range(3,addfields+3) 
     self.fields['input%d' % i] = forms.CharField() 
2

Je définirais input3 dans votre définition de formulaire, ne pas l'exiger, puis le masquer par défaut. L'utilisateur peut alors montrer l'entrée en utilisant JavaScript.

Si vous voulez permettre à l'utilisateur d'ajouter une quantité indéfinie d'entrées supplémentaires, je regarderais plus loin dans formsets.

0

Peut-être quelque chose comme ceci:

from django import forms 
from django.utils.datastructures import SortedDict 
def some_view(request): 
    data = {} 

    # Using session to remember the row count for simplicity 
    if not request.session.get('form_rows', None): 
     request.session['form_rows'] = 3 

    # If posted with add row button add one more row 
    if request.method == 'POST' and request.POST.get('rows', None): 
      request.session['form_rows'] += 1 
      data = request.POST 

    # Create appropriate number of form fields on the fly 
    fields = SortedDict() 
    for row in xrange(1, request.session['form_rows']): 
     fields['value_{0}'.format(row)] = forms.IntegerField() 

    # Create form class 
    MyForm = type('MyForm', (forms.BaseForm,), { 'base_fields': fields }) 

    form = MyForm(initial=data) 

    # When submitted... 
    if request.method == 'POST' and not request.POST.get('rows', None): 
     form = MyForm(request.POST) 
     if form.is_valid(): 
      # do something 
    return render_to_response('some_template.html', { 
     'form':form, 
    }, context_instance=RequestContext(request)) 

Avec modèle:

<form action="" method="post"> 
    {{ form }} 
    <input type="submit" /> 
    <input type="submit" value='Add' name='rows' /> 
</form> 

Ceci est plus simplifié, mais cela fonctionne.

Vous pouvez facilement modifier cet exemple afin de pouvoir faire une demande en utilisant AJAX et simplement remplacer l'ancien formulaire par un nouveau.

Questions connexes