如有必要,在表单中添加字段django

如有必要,在表单中添加字段django,django,django-forms,Django,Django Forms,我正在尝试制作一个表单,它可以一次添加多个对象。我希望它有一个按钮“添加另一个”-当点击一个新的表单字段将出现添加其他对象。如果有以前未提交的输入,我希望表单保留它。是否可以为此使用模板标记(即django模板标记而不是javascript) 您的表单必须基于您的帖子传递给它的一些变量来构建(或者盲目地检查属性)。无论是否有错误,每次重新加载视图时都会构造表单本身,因此HTML需要包含关于有多少字段的信息,以构造正确数量的字段进行验证 我将以FormSets的工作方式来看待这个问题:有一个隐藏字

我正在尝试制作一个表单,它可以一次添加多个对象。我希望它有一个按钮“添加另一个”-当点击一个新的表单字段将出现添加其他对象。如果有以前未提交的输入,我希望表单保留它。是否可以为此使用模板标记(即django模板标记而不是javascript)

您的表单必须基于您的帖子传递给它的一些变量来构建(或者盲目地检查属性)。无论是否有错误,每次重新加载视图时都会构造表单本身,因此HTML需要包含关于有多少字段的信息,以构造正确数量的字段进行验证

我将以
FormSet
s的工作方式来看待这个问题:有一个隐藏字段,其中包含活动表单的数量,每个表单名称前面都有表单索引。事实上,您可以创建一个字段
FormSet

这是一个从零开始制作的-它应该给你一些想法。它还回答了您关于将参数传递给
\uuuu init\uuuu
的问题-您只需将参数传递给对象构造函数:
MyForm('arg1','arg2',kwarg1='keyword arg')

###视图

class MyForm(forms.Form):
    original_field = forms.CharField()
    extra_field_count = forms.CharField(widget=forms.HiddenInput())

    def __init__(self, *args, **kwargs):
        extra_fields = kwargs.pop('extra', 0)

        super(MyForm, self).__init__(*args, **kwargs)
        self.fields['extra_field_count'].initial = extra_fields

        for index in range(int(extra_fields)):
            # generate extra fields in the number specified via extra_fields
            self.fields['extra_field_{index}'.format(index=index)] = \
                forms.CharField()



def myview(request):
    if request.method == 'POST':
        form = MyForm(request.POST, extra=request.POST.get('extra_field_count')
        if form.is_valid():
            print "valid!"
    else:
        form = MyForm()
    return render(request, "template", { 'form': form })
    
###HTML

form_count = Number($("[name=extra_field_count]").val());
// get extra form count so we know what index to use for the next item.
$("#add-another").click(function() {
    form_count ++;

    element = $('<input type="text"/>');
    element.attr('name', 'extra_field_' + form_count);
    $("#forms").append(element);
    // build element and append it to our forms container

    $("[name=extra_field_count]").val(form_count);
    // increment form count so our view knows to populate 
    // that many fields for validation
})

<form>
<div id="forms">
    {{ form.as_p }}
</div>
<button id="add-another">add another</button>
<input type="submit" />
</form>
form_count=Number($(“[name=extra_field_count]”).val());
//获取额外的表单计数,以便我们知道下一项使用什么索引。
$(“#添加另一个”)。单击(函数(){
form_count++;
元素=$('');
元素属性('name'、'extra\u field\u'+form\u count);
$(“#表格”)。附加(元素);
//构建元素并将其附加到表单容器中
$(“[name=extra\u field\u count]”)val(form\u count);
//增加表单计数,以便我们的视图知道如何填充
//需要验证的字段太多了
})
{{form.as_p}}
再加一个