2010-07-14 96 views
2

我的線沿線的一種形式:是否可以將單行添加到Django表單中?

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

什麼我希望做的是增加一個額外的輸入3的形式,當用戶點擊「添加另一個輸入3」。

我讀過一堆讓我使用formset添加新窗體的方法,但我不想追加一個新窗體,我只想添加一個新的窗體input3。

這可能嗎?

回答

2

用於添加動態字段覆蓋init方法。

事情是這樣的:

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

我會在您的表單定義中定義input3,不需要它,然後在默認情況下隱藏它。用戶然後可以使用JavaScript顯示輸入。

如果你想允許用戶添加一個未定義數量的額外輸入,我會進一步研究formset。

0

也許是這樣的:

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)) 

隨着模板:

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

它是在簡化,但它的工作原理。

你可以很容易地修改這個例子,所以你可以使用AJAX發出請求,並用新的表單替換舊錶單。

相關問題