2014-10-01 22 views
0

我剛剛開始使用formset,並且遇到了製作用戶友好的錯誤系統的麻煩。如何處理大型表單中的錯誤?

因此,用戶看到一個列表視圖,顯示他已經寫入到formset中的模型的所有實例。本頁面旨在向他展示數據並編輯它。

在我使用大量單獨的窗體併爲每個窗體使用保存按鈕之前。但現在我想改進它,爲所有表單提供單個保存按鈕。

但是出現了我的問題:我之前通過「action」將用戶發送到另一個處理請求的url(例如.../update /),然後將其發送回他之前看到的列表視圖。這是爲了避免在碰到F5時多次提交。

但現在如果我這樣做,只有一個表單是錯誤的,用戶輸入的所有信息都會丟失。

因此,我停止使用額外的URL並使處理部分的列表視圖。現在我可以在每個表單上使用form.error,但用戶重新提交時按F5。

有沒有辦法兼得?

另外:我有1個額外的表格。但是,如果用戶更改它,並且將POST數據提交到formset中,請保存它,然後將其放回到頁面上,因爲我現在失去了額外的formset,因爲現在前者額外顯示新輸入的實例,並且沒有真正的額外字段離開,直到頁面刷新而不發送發佈數據。

這是我的觀點:

class BVServerListView(View): 
    def get(self, request): 
    eigene_server = Server.objects.filter(user=request.user) 
    EigeneServerFormset = modelformset_factory(Server, extra=1, form=ServerForm) 
    eigene_server_formset = EigeneServerFormset(queryset=eigene_server) 
    context = {'eigene_server': eigene_server_formset,} 
    return render(request, 'bildverteiler/server_list.html', context) 
    def post(self, request): 
    eigene_server = Server.objects.filter(user=request.user) 
    EigeneServerFormset = modelformset_factory(Server, extra=1, form=ServerForm) 
    eigene_server_formset = EigeneServerFormset(request.POST, request.FILES) 
    for form in eigene_server_formset.forms: 
     if form.data.get('delete', False): 
     server = Server.objects.get(user=request.user, name=form.data['name']) 
     server.delete() 
     else: 
     if form.has_changed() and form.is_valid(): 
      server = form.save(commit=False) 
      server.user = request.user 
      server.save() 
    context = {'eigene_server': eigene_server_formset,} 
    return render(request, 'bildverteiler/server_list.html', context) 

回答

0

有使用單一的形式或在這裏一個formset之間沒有區別。答案是一樣的:張貼到相同的視圖,但成功保存後重定向。

您在這裏做錯的另一件事是驗證並逐個保存單個表單。不要這樣做,因爲最終可能會出現第一個表單有效並得到保存的情況,但後續表單無效,因此需要重新顯示錶單集。相反,驗證整個表單集:

if eigene_server_formset.is_valid(): 
    for form in eigene_server_formset.forms: 
     if form.cleaned_data.get('delete'): 
      ... delete ... 
     else: 
      form.save() 
    return HttpResponseRedirect('somewhere_else') 
return render...