我有一个表格:
class aForm(forms.Form):
input1 = forms.CharField()
input2 = forms.CharField()
input3 = forms.CharField()
我希望在用户点击“添加另一个输入3”时向表单添加一个额外的输入3。
我已经阅读了一些让我使用formset添加新表单的方法,但我不想添加新表单,我只想添加一个新的input3。
这可能吗?
答案 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发出请求,只需将旧表单替换为新表单。