我有一個返回JsonResponse的視圖。我想使用Building實例(結構變量)生成pdf報告。Django - 使用相同的類實例返回Pdf和JsonResponse
例如,返回JsonResponse的觀點是:
@login_required
def buildings(request):
if request.POST and request.is_ajax():
s_form = BuildingForm(request.POST)
if s_form.is_valid():
structure = Building(**s_form.cleaned_data)
html = render_to_string('wind/results/buildings/buildings_results.html', {'structure': structure})
return JsonResponse({"result": html})
else:
return JsonResponse({'building_errors': s_form.errors,
status=400)
else:
s_form = BuildingForm()
return render(request, 'wind/buildings.html', {'s_form': s_form})
我有生成並返回PDF下面的代碼:
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename="Report.pdf"'
buffer = BytesIO()
report = BuildingsReport(structure) # I want to use the same Building instance
pdf = report.generate_pdf()
response.write(pdf)
return response
我要的是使用相同的建築實例用於生成pdf和html變量。
使用不同的視圖來返回PDF意味着一個新的建築實例。除此之外,還有另一種解決方案使用另一種視圖解決問題。
在前端,我想顯示JsonResponse並讓用戶可以使用pdf下載使用HTML按鈕。
使用芹菜適合這項任務嗎?
提前致謝!
感謝您的回覆。我對答案的第一部分有疑問。代碼可以選擇生成pdf或html。如果我調用html的視圖函數,然後調用pdf,則該類會被調用兩次並生成兩次結果? 這就是結果在瀏覽器中顯示的方式。 [結果](https://i.imgur.com/WV6fU07.png) – Eduardo
關於答案的第二部分我將調查芹菜的使用。我現在可以在視圖中延遲任務,但是如何在以後使用圖像中顯示的按鈕調用,從url引用其他視圖? – Eduardo
-first:如果您向視圖發送兩個請求,該視圖將生成兩個響應,HTTP是一個無狀態協議,您有責任緩存您希望在兩個響應之間共享的任何中間結果。 -second:您可能需要編寫另一個視圖來檢查狀態(這將輸出任務的狀態),另一個視圖請求文件,這將處理Content-Disposition標頭以下載文件,這些視圖完全相同完全不同的問題。 – fixmycode