我正在使用标准的Django模型表单,然后在HTML模板中用于我们目前正在重新编写的应用程序系统。
棘手的一点(至少对我来说)是这个过程中的一步,它使用一个名为"SheepIt"的jQuery插件动态地向HTML添加其他表单,我想知道如何轻松收集所有表单数据在相关的观点中。
The SheepIt位:
$(document).ready(function() {
var sheepItForm = $('#sheepItForm').sheepIt({
separator: '',
allowRemoveLast: true,
allowRemoveCurrent: true,
allowRemoveAll: false,
allowAdd: true,
allowAddN: false,
minFormsCount: 1,
iniFormsCount: 1
});
});
模板代码:
<div id="entry_form">
<form method="post" enctype="multipart/form-data" action="/enter/2/" id="sheepItForm">
<fieldset id="sheepItForm_template">
<a id="sheepItForm_remove_current">X</a>
<div class="select">{{ form.select }}</div>
<div class="text">{{ form.text }}</div>
<div class="upload">{{ form.upload }}</div>
</fieldset>
<div id="sheepItForm_noforms_template">No Entries</div>
<div id="sheepItForm_controls">
<div id="sheepItForm_add"><a><strong>+</strong> Add Another Entry</a></div>
</div>
{{ formset.management_form }}
<input type="submit" value="Proceed to Payment">
</form></div>
上面输出一个带有按钮的小形式,使用SheepIt插件添加和删除表单的克隆。
通常情况下,我们会使用以下内容收集表单数据:
form_data = request.POST.copy()
或类似的。我是否应该迭代在帖子数据中收集的所有内容,或者是否有更好的“pythonic”方式来处理这些小克隆?也许将它们收集到一个formset然后做类似的事情:
for f in formset.forms:
if f.is_valid():
f.save()
编辑: 这里有一些我目前正在切割和改变的观点代码:
form = EntryForm_2_set.form()
template_dict['form'] = form
if request.method == 'POST':
# from forms.py: EntryForm_2_set = forms.formsets.formset_factory(EntryForm_2, extra=0)
formset = EntryForm_2_set(request.POST)
if formset.is_valid():
for f in formset.forms:
if f.is_valid():
f.save()
entry_url = reverse('entry-stage',kwargs={'stage':3})
return HttpResponseRedirect(entry_url)
else:
formset = EntryForm_2_set()
template_dict['formset'] = formset
return render_to_response('submission-stage-two.html', template_dict, RequestContext(request))
任何想法的人?
答案 0 :(得分:1)
管理最终将自己整理出来。
只有剩下的就是在重新进入时填写表格。
我之前缺少的是具有灵活性的formset工厂的实现。如果有更优雅的解决方案,我有兴趣听取有关未来更新的建议。
干杯。
查看代码:
# Create the formset factory with an initial form (extra=1)
EntryForm_2Set = formset_factory(EntryForm_2,extra=1)
if request.method == 'POST':
formset = EntryForm_2Set(request.POST,request.FILES)
if formset.is_valid():
instances = []
for f in formset.forms:
# get the new applicant instance
inst = f.save()
instances.append(inst)
for i in instances:
# amend the applicant instance
i.applicant = request.session['applicant']
i.save()
num_entered = formset.total_form_count()
entry_url = reverse(...) # some reversal
return HttpResponseRedirect(entry_url)
else:
formset = EntryForm_2Set()
template_dict['formset'] = formset
return render_to_response('submission-stage-two.html', template_dict, RequestContext(request))
模板代码:
<div id="entry_form">
<form method="post" enctype="multipart/form-data" action="/enter/2/" id="sheepItForm">
{% for form in formset.forms %}
<fieldset id="sheepItForm_template">
<a id="sheepItForm_remove_current">X</a>
<div class="select">{{ form.select }}</div>
<div class="text">{{ form.text }}</div>
<div class="upload">{{ form.upload }}</div>
</fieldset>
{% endfor %}
<div id="sheepItForm_controls">
<div id="sheepItForm_add"><a ><strong>+</strong> Add Another</a></div>
</div>
{{formset.management_form }}
<input type="submit" value="Proceed">
答案 1 :(得分:0)
是的,使用formset开头。然后初始表单上的字段将有一个前缀,您可以在克隆的表单上修改它们以使它们唯一。不要忘记更新formset管理数据。