新手的问题。
有一个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。
答案 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;
Views.py:
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;
答案 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>