首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如有必要,将字段添加到表单中

如有必要,将字段添加到表单中
EN

Stack Overflow用户
提问于 2017-05-26 07:39:09
回答 1查看 1.2K关注 0票数 1

我正在尝试创建一个表单,它可以一次添加多个对象。我希望它有一个按钮“添加另一个”-当点击一个新的表单字段将显示为添加额外的对象。如果有以前没有提交的输入,我希望表单保留它。是否可以使用模板标记(即django模板标记而不是javascript)?

EN

Stack Overflow用户

回答已采纳

发布于 2017-05-26 07:46:31

您的表单必须基于从POST传递给它的一些变量(或者盲目地检查属性)来构造。表单本身是在视图被重新加载时构造的,不管是否有错误,所以HTML需要包含有多少字段的信息来构造正确的字段数量以进行验证。

我用FormSet的工作方式来看待这个问题:有一个隐藏字段,它包含活动表单的数量,每个表单名都加上表单索引。实际上,您可以创建一个字段FormSet

https://docs.djangoproject.com/en/dev/topics/forms/formsets/#formsets

这是一个从头开始做的-它应该给你一些想法。它还回答了有关向__init__传递参数的问题??您只需将参数传递给对象构造函数:MyForm('arg1', 'arg2', kwarg1='keyword arg')

### Views

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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>
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44196166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档