【问题标题】:Add forms in formset with Django and JS使用 Django 和 JS 在表单集中添加表单
【发布时间】:2019-04-11 20:00:51
【问题描述】:

我希望能够使用Add 按钮在我的formset 中动态添加django forms

我尝试写不同的东西,但到目前为止我还没有克服得到预期的结果。

我在 forms.py 文件中定义了一个 formset

AnimalFormSet = inlineformset_factory(Elevage, Animal, form=AnimalForm, extra=1)

然后,我在我的 views.py 文件中创建了这个函数:

class ElevageCreateView(CreateView):

    model = Elevage
    template_name = 'elevage_form.html'

    def get_context_data(self, **kwargs):
        context = super(ElevageCreateView, self).get_context_data(**kwargs)
        context['AnimalFormSet'] = AnimalFormSet(self.request.POST or None, self.request.FILES or None)
        return context

    def form_valid(self, form):
        context = self.get_context_data()
        animal = context['AnimalFormSet']
        if animal.is_valid():
            self.object = form.save()
            animal.instance = self.object
            animal.save()
        return super(ElevageCreateView, self).form_valid(form)

    def get_success_url(self):
        return reverse('animal-list')

最后,我正在尝试编写我的模板文件

<fieldset>
    <legend class="title"><span class="name">{% trans 'Animal form' %}</span></legend>
    {{ AnimalFormSet.management_form }}
      {% for form in AnimalFormSet.forms %}
        <div class='table'>
           <table class='no_error'>
             {{ form.as_table }}
           </table>
        </div>
      {% endfor %}
    <input type="button" class="btn btn-default" value="Add More" id="add_more">
    <script>
      $('#add_more').click(function () {
        cloneMore('div.table:last', 'service');
      });
    </script>
  </fieldset>

我有 javascript 功能

 <script>
  function cloneMore(selector, type) {
    var newElement = $(selector).clone(true);
    var total = $('#id_' + type + '-TOTAL_FORMS').val();
    newElement.find(':input').each(function() {
        var name = $(this).attr('name').replace('-' + (total-1) + '-','-' + total + '-');
        var id = 'id_' + name;
        $(this).attr({'name': name, 'id': id}).val('').removeAttr('checked');
    });
    newElement.find('label').each(function() {
        var newFor = $(this).attr('for').replace('-' + (total-1) + '-','-' + total + '-');
        $(this).attr('for', newFor);
    });
    total++;
    $('#id_' + type + '-TOTAL_FORMS').val(total);
    $(selector).after(newElement);
}
  </script>

我花了很多时间来获得预期的结果,但我没有克服它。所以如果你能帮助我,我需要你的帮助。

我不想使用其他库,但我接受JSAJAXJQuerydjango 的回答!

提前谢谢你

编辑:

问题是:

它显示第一个表单,但是当我想通过单击Add button 添加第二个表单时,它不会创建第二个表单。

所以我假设我的 Django 部分很好,但不是 JS 部分?

【问题讨论】:

  • 您还没有真正确定所显示代码的具体问题是什么。它与预期结果有何不同?
  • 好的,我将编辑我的代码。但是如果我也可以在这里回答,当我点击Add button 时,什么都不会出现。
  • 问题在于函数调用cloneMore('div.table:last', 'service'); 中的“选择器”部分。您的标记中没有带有class="table" div 元素来匹配调用。你可以参考stackoverflow.com/a/669982/1472458的答案
  • 我编辑了我的答案,因为它似乎不适用于好的选择器。
  • 没人?它使我在这个问题上被阻止了超过 1 周,并且有可能向表单集添加额外的表单:/

标签: javascript jquery ajax django formset


【解决方案1】:

我正在解决同样的问题,发现这很有帮助post

基本上,我们可以使用表单集的empty_form 属性,并在每次要添加表单时克隆它。虽然表单集中的每个表单都有form-&lt;index&gt; 前缀,但empty_form 属性有form-__prefix__,当我们克隆它时,我们应该用下一个表单索引替换它。

不要忘记增加 form-TOTAL_FORMS 隐藏输入的值,以便 Django 知道提交的表单集中有多少表单。

formset_wrapperemptyform_wrapper 用于更轻松地进行 jQuery 元素注入。

<fieldset>
  <legend class="title"><span class="name">{% trans 'Animal form' %}</span></legend>
  {{ AnimalFormSet.management_form }}
  <div id="formset_wrapper">
    {% for form in AnimalFormSet.forms %}
    <div class='table'>
      <table class='no_error'>
        {{ form.as_table }}
      </table>
    </div>
    {% endfor %}
  </div>
  <div id="emptyform_wrapper" style="display: none">
    <div class='table'>
      <table class='no_error'>
        {{ AnimalFormSet.empty_form.as_table }}
      </table>
    </div>
  </div>

  <input type="button" class="btn btn-default" value="Add More" id="add_more">
</fieldset>
<script>
  $('#add_more').click(function () {
    let total_form = $('#id_form-TOTAL_FORMS');
    let form_idx = total_form.val();

    $('#formset_wrapper').append($('#emptyform_wrapper').html().replace(/__prefix__/g, form_idx));
    total_form.val(parseInt(form_idx)+1);
  });
</script>

试试这个snippet 上面的 Django 模板的渲染示例

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 2015-10-29
    相关资源
    最近更新 更多