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

2 投票
3 回答
966 浏览
提问于 2025-04-16 01:17

我有一个表单,内容大致是这样的:

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

我希望在用户点击“添加另一个输入3”时,能在表单中增加一个额外的输入框input3。

我看过很多方法可以使用表单集合来添加新的表单,但我不想添加一个新的表单,我只是想增加一个新的输入框input3。

这样做可以吗?

3 个回答

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来发送请求,然后把旧的表单替换成新的表单。

2

我建议你在表单定义中定义一个叫做 input3 的输入框,但不要把它设为必填,然后默认把它隐藏起来。用户可以通过JavaScript来显示这个输入框。

如果你想让用户可以添加不确定数量的额外输入框,我建议你进一步了解一下表单集合(formsets)。

2

要添加动态字段,可以重写初始化方法。

可以像这样做:

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

撰写回答