我剛剛開始使用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)