2015-04-28 39 views
0

我在名爲spectacle的視圖函數中使用modelformset_factory和名爲selection的對象。每件物品都得到保存。但在此之後,頁面會被加載 與以前的項目。這種不受歡迎的行爲。使用modelformset模板formset字段中的殘差值

我錯過了什麼?這是否與驗證有關?

這裏求和式的代碼:

from django.forms.models import modelformset_factory 

def spectacle(request, id_spectacle=0): 

selections_formset = modelformset_factory(Selection, fields=('nom',), extra=1) 
if request.method == 'POST': 
    formset = selections_formset(request.POST, request.FILES) 
    if formset.is_valid(): 
     for selection_form in formset: 
      selection_from_formset = selection_form.save(commit=False) 
      if selection_from_formset.nom != "" and selection_from_formset.nom is not None : 
       selection_from_formset.save() 
     message = 'success' 
     for fs in formset: 
      print fs.cleaned_data 
    else: 
     message = 'fail' 
    return render(request, 'create_spectacle.html', 
        {"formset": equipes_formset 
        }) 
else: 
    return render(request, 'create_spectacle.html', 
         {"formset": equipes_formset 
         }) 


<div id="my_form"> 
<form action="{% url 'create_spectacle' %}" method="post"> 
{% csrf_token %} 
{{ formset.management_form }} 
<div id="formsetZone"> 
    {% for form in formset %} 
     <div class="nformset_form"> 
      <h3>Equipe</h3> 
      {{ form.as_p }} 
     </div> 
    {% endfor %} 
</div> 
<input type="submit"/> 
</form> 

回答

0

您正在生成與POST數據(將其保存)的形式。 然後使用相同的POST數據呈現相同的formset。這對於顯示錯誤很有用,但在成功的情況下,不是你想要的

標準模式是保存form/formset(然後假設沒有錯誤)重定向。在你的情況下重定向到表單的GET版本。

前的第一個「其他」添加類似

 return HttpResponseRedirect("add the url to your view here")  

然後它會運行相同的代碼,但沒有POST數據。或者,將其他網址添加到成功頁面。

這裏是在文檔的例子(對於單一形式,但其原理相同): https://docs.djangoproject.com/en/1.8/topics/forms/#the-view

你缺少行:

 return HttpResponseRedirect('/thanks/') 
+0

謝謝你的提醒,但 雖然它與formset之外的其他字段一起工作(我沒有提到要簡化),但它不適用於formset。 重定向工作正常,並生成get請求,但formset字段顯示充滿了上一個值。 它似乎與第二行有關:selections_formset = modelformset_factory(Selection,fields =('nom',),extra = 1) – Proph73