我应该使用django-dynamic-formset还是有一个bettor解决方案?

时间:2016-08-23 08:21:46

标签: django django-forms

新手的问题。

有一个django-dynamic-formset。

我们可以看到该项目最后更新于8个月前: https://github.com/elo80ka/django-dynamic-formset/branches

据我所知,这个应用程序前段时间众所周知。我的意思是在互联网上我可以找到讨论和例子。但所有材料都是几年前出版的。

并且有一个值得尊重的网站https://djangopackages.org/grids/g/forms/

没有提到django-dynamic-formset。这让我对这个应用程序有点怀疑。

您能告诉我动态添加表单到Django formset的主流解决方案是什么?

顺便说一句 Django 1.10。

3 个答案:

答案 0 :(得分:1)

我使用了以下方法。 每次将新表单添加到网页时javascript都会增加一个全局变量form_num,而在views.py中,该值将从POST数据中获取并替换form-TOTAL_FORMS值。

我使用empty_form作为新表单的模板。

我必须复制POST数据,因为POST本身是不可变的。

模板/ index.html中:



<script>
  var form_num = 0;
  $(document).ready(function() {
        $("#additemsbutton").on('click',function(event)
        {
          ++form_num;
          $('#form_set').append($('#empty_form').html().replace(/__prefix__/g, form_num));
          $("#additems").val(form_num + 1);
       });
     });
</script>
&#13;
<form action='' method="post">
    {% csrf_token %}
  <h1>Company details</h1>
    {{ company_form.as_p}}
  <h1>Project details</h1>
    {{ info_formset.management_form }}
    <div id="form_set">
      {% for form in info_formset %}
        {{ form.as_p }}
      {% endfor %}
    </div>
  <div id="empty_form" style="display:none">
      {{ info_formset.empty_form.as_p }}
  </div>
  <input type="hidden" value="1" name="additems" id="additems">
  <input type="button" id="additemsbutton" value="Add Project">
  <button type="submit" value="Submit" class="btn btn-primary">Submit</button>
</form>
&#13;
&#13;
&#13;

Views.py:

&#13;
&#13;
def index(request):
    extra_forms = 1
    InfoFormSet = inlineformset_factory(Company, Info, form=InfoForm, extra=extra_forms)
    if request.method == 'POST':
        print(request.POST)
        formset_dictionary_copy = request.POST.copy()
        formset_dictionary_copy['info_set-TOTAL_FORMS'] = int(
            formset_dictionary_copy['additems'])
        company_form = CompanyForm(formset_dictionary_copy)
        if company_form.is_valid():
            c = company_form.save()
        info_formset = InfoFormSet(formset_dictionary_copy)
        if info_formset.is_valid():
            formset = info_formset.save(commit=False)
            for i in formset:
                i.company = c
                i.save()
            return HttpResponseRedirect(reverse('pform:index'))
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您可以使用Ajax,示例和出色的解释in this post.如果您关注所维护的软件包,这是我建议使用的解决方案。

答案 2 :(得分:0)

<script>
  var form_num = 0;
  $(document).ready(function() {
        $("#additemsbutton").on('click',function(event)
        {
          ++form_num;
          $('#form_set').append($('#empty_form').html().replace(/__prefix__/g, form_num));
          $("#additems").val(form_num + 1);
       });
     });
</script>
<form action='' method="post">
    {% csrf_token %}
  <h1>Company details</h1>
    {{ company_form.as_p}}
  <h1>Project details</h1>
    {{ info_formset.management_form }}
    <div id="form_set">
      {% for form in info_formset %}
        {{ form.as_p }}
      {% endfor %}
    </div>
  <div id="empty_form" style="display:none">
      {{ info_formset.empty_form.as_p }}
  </div>
  <input type="hidden" value="1" name="additems" id="additems">
  <input type="button" id="additemsbutton" value="Add Project">
  <button type="submit" value="Submit" class="btn btn-primary">Submit</button>
</form>