以正确的方式使用javascript将动态表单添加到Django表单集中

发布于 2021-01-29 17:07:02

如何在不烦人的html模板输出副本的情况下向模板中的django表单集添加动态表单?

我有一个结果集数量未知的表单集,我需要通过按一个按钮直接在模板中添加一些表单。

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    自我解答基于Nick Lang的这篇文章,但是我们将简化这种方式,并且不再需要复制/粘贴整个html格式。

    我们有一个内联表单集,它是在如下视图中创建的:

    items_formset = inlineformset_factory(Parent, Item, form=ItemForm, extra=1)
    item_forms = items_formset()
    

    接下来,我们需要为formset表单创建一个模板,我们可以使用empty_formformset实例的属性来执行此操作,该属性会生成一个html表单模板,其中表单的每个“
    id”数字都由__prefix__字符串替换,例如:

    <!--
    {{ item_forms.empty_form }}
    
    {# <!-- or for crispy forms --> {% crispy item_forms.empty_form item_forms.form.helper %} #}
    -->
    

    因此,首先我们需要__prefix__用一个ID替换它,并使用此模板添加一个表单。
    这是一个表单模板代码片段,可用于创建新元素:

    <script type="text/html" id="item-template">
    <div id="item-__prefix__">
        {{ item_forms.empty_form }}
        <!-- crispy: {% crispy item_forms.empty_form item_forms.form.helper %} -->
    </div>
    </script>
    

    然后,我们需要显示表单的主要部分:

    <form action="" method="post">
    {% csrf_token %}
    {{ item_forms.management_form }}
    <div id="items-form-container">
        {% for item_form in item_forms %}
            <div id="item-{{ forloop.counter0 }}">
                {{ item_form.id }}
                {{ item_form.as_p }}
                {# <!-- or for crispy forms --> {% crispy item_form %} #}
            </div>
        {% endfor %}
    </div>
    <a href="#" id="add-item-button" class="btn btn-info add-item">Add Item</a>
    </form>
    

    最后,我们需要添加一些JS(通过1.9.1和2.1.0测试的jQuery)以添加下一个formset表单。请注意,我们不会使用underscore.js,因为在这种情况下是不需要的:只需用str.replace替换__prefix__下一个“
    id”数字)

    <script>
    $(document).ready(function() {
        $('.add-item').click(function(ev) {
            ev.preventDefault();
            var count = $('#items-form-container').children().length;
            var tmplMarkup = $('#item-template').html();
            var compiledTmpl = tmplMarkup.replace(/__prefix__/g, count);
            $('div#items-form-container').append(compiledTmpl);
    
            // update form count
            $('#id_item_items-TOTAL_FORMS').attr('value', count+1);
    
            // some animate to scroll to view our new form
            $('html, body').animate({
                    scrollTop: $("#add-item-button").position().top-200
                }, 800);
        });
    });
    </script>
    

    就这样,只需单击“添加项目”按钮,就会出现一个新的表单集项目。

    确保用您的app_name / model_name替换此样本。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看