可以在Django表单中添加一行吗?

时间:2010-07-14 14:44:24

标签: python django forms django-forms

我有一个表格:

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

我希望在用户点击“添加另一个输入3”时向表单添加一个额外的输入3。

我已经阅读了一些让我使用formset添加新表单的方法,但我不想添加新表单,我只想添加一个新的input3。

这可能吗?

3 个答案:

答案 0 :(得分:2)

我会在您的表单定义中定义input3,不需要它,然后默认隐藏它。然后,用户可以使用JavaScript显示输入。

如果你想允许用户添加一定数量的额外输入,我会进一步研究formsets。

答案 1 :(得分: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 :(得分: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发出请求,只需将旧表单替换为新表单。