私は標準の Django モデル フォームを使用しています。これは、現在再調整中のアプリケーション システムの HTML テンプレートで使用されます。
トリッキーな部分 (少なくとも私にとって) は、"SheepIt"と呼ばれる jQuery プラグインを使用して追加のフォームを HTML に動的に追加するプロセスの 1 つのステップです。
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」な方法がありますか? おそらくそれらをフォームセットにまとめてから、次のようなことを行います。
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))
アイデアはありますか?