2012-11-06 66 views
1

我使用標準的Django模型表單,然後在HTML模板中使用我們當前正在重新調整的應用程序系統。如何在提交時收集克隆的Django表單?

棘手位(至少對我來說)是在其中動態地增加了額外的形式使用jQuery插件稱爲"SheepIt" HTML中的過程中的一個步驟,我想知道如何將所有的表單數據可從有關的被容易地收集視圖。

的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

表單集是這樣的事情更好,但你需要_SheepIt_插上它發送適當的數據。可能有一些django特定的插件,您可以使用動態數量的表單。 – Rohan

+0

感謝Rohan,我實際上已經做了一些紮根,我嘗試[django-dynamic-formset](http://code.google.com/p/django-dynamic-formset/)開始。 – Ogre

+0

無果,悲傷。 – Ogre

回答

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

0

是的,使用formset開始。然後,初始表單上的字段將會有一個前綴,您可以在克隆的表單上修改它們以使它們唯一。不要忘記更新formset管理數據。

+0

嘿丹尼爾,謝謝你的快速回復!我發現SheepIt確實爲每個字段集設置了一個唯一的ID,但是我不太清楚您更新管理數據的意思,以及我會如何去完全分離出克隆。我正在使用一些額外的代碼片段來更新問題,這些代碼片段已經清理完畢。 (遺留代碼... ergh) – Ogre