2012-10-18 32 views
4

Django的:1.4.1modelformset_factory不接受額外的參數

型號:

class Hoja(models.Model): 
    nombre = models.CharField(max_length=200) # requerido 

class Linea(models.Model): 
    hoja = models.ForeignKey(Hoja) # requerido 
    nombre = models.CharField(max_length=200) # requerido 
    padre = models.ForeignKey('self', null=True, blank=True, related_name='hijo') 

查看:

lineas = Linea.objects.filter(hoja=alt).order_by('id') 
LineaHojaSet = modelformset_factory(Linea, can_delete=True, extra=1 if request.POST.has_key('siguiente') else 0) 
formset = LineaHojaSet(request.POST or None, queryset=lineas) 
if request.method=='POST': 
    # process formset 
return render_to_response('template.html', {'formset':formset}, context_instance=RequestContext(request)) 

模板:

<table> 
    <thead> 
     <tr><th>Nombre</th><th>Borrar</th></tr> 
    </thead> 
    <tbody> 
     {% for fs in formset %} 
     <tr> 
      <td>{{ fs.nombre }}</td> 
      <td>{{ fs.id }}</td> 
     </tr> 
     {% endfor %} 
    </tbody> 
</table> 
<input type="submit" name="siguiente" value="Añadir siguiente" /> 

當我提交了「 siguiente「按鈕,我可以看到比f ormset正在獲得正確的額外字段1,但在網頁中,唯一顯示的數據行是數據庫字段。這是一個錯誤,或者我做錯了什麼?

回答

2

Formset工廠通過max_num,extra參數或form-TOTAL_FORMS參數中的request.POST(或數據)查找來自管理窗體的表單數量。

在你的情況下,request.POST['form-TOTAL_FORMS']的號碼不包括額外的形式。所以在創建formset時不會添加額外的表單。

解決方案之一就是在符合條件時將此數字加1。例如

data = None 
if request.POST: 
    data = request.POST.copy() #required as request.POST is immutable 
if request.POST.has_key('siguiente'): 
    data['form-TOTAL_FORMS'] = int(data['form-TOTAL_FORMS']) + 1 

#now use data instead of request.POST 
formset = LineaHojaSet(data, queryset=lineas) 
.... 

但是,以這種方式操作formset存在一些缺點。當您驗證formset時,如果有任何必填字段,額外的表單將顯示錯誤。

更好的解決方案是在將模板傳遞給一個額外的表單和查詢集之前再次創建formset。最有可能的情況是,當formset有效時,您將保存任何新對象,這些對象將被queryset添加。所以你的頁面會顯示新添加的對象和一個額外的表單。

lineas = Linea.objects.filter(hoja=alt).order_by('id') 
LineaHojaSet = modelformset_factory(Linea, can_delete=True,) 
formset = LineaHojaSet(request.POST or None, queryset=lineas) 
if request.method=='POST': 
    # process formset 
    if formset.is_valid: 
     #saved and done with formset. 
     if request.POST.has_key('siguiente'): 
      LineaHojaSet = modelformset_factory(Linea, can_delete=True, extra=1) 
      formset = LineaHojaSet(queryset=lineas) 
      ... 
return render_to_response('template.html', {'formset':formset}, context_instance=RequestContext(request)) 
+0

我只是在POST後設置了「siguiente」字段才顯示額外的行。在正常的GET我只想顯示數據庫的。 – voodmania

+0

通過POST獲取數據,我不確定在處理POST後如何顯示數據/表單。您可能想要顯示完整的視圖代碼。 – Rohan

+0

我編輯了視圖代碼,以顯示我總是發送並顯示formset。我的問題是,我無法顯示額外的行我強制提交「siguiente」按鈕。 – voodmania