1

私は標準の 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)) 

アイデアはありますか?

4

2 に答える 2

1

最終的に自分でそれを整理することができました。

残っているのは、再入国時にフォームに記入することだけです。

以前私が見逃していたのは、柔軟なフォームセット ファクトリの実装でした。より洗練された解決策があれば、将来の更新に関する提案を聞きたいです。

乾杯。


コードを表示:

# 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"> 

于 2012-11-13T12:13:22.213 に答える
0

はい、最初はフォームセットを使用してください。その後、最初のフォームのフィールドにはプレフィックスが付けられ、複製されたフォームで変更して一意にすることができます。フォームセット管理データも更新することを忘れないでください。

于 2012-11-06T12:40:39.613 に答える