讓使用者可以在Django網站中下載資料表內容

有時候我們在製作網站的時候,會有一些情況是讓使用者在瀏覽想要的資料之後,也可以一併下載這些資料成為本地端的文字檔案,這時候就需要讓網站具備下載資料並儲存成檔案的功能,我們這篇文章就來簡單地說明Django網站提供此種功能的一些技巧。

假設我們想要把某一個資料表中的所有記錄全部輸出,並轉成JSON格式,讓瀏覽器可以呈現出這些資料,那麼我們可以在 views.py 中建立一個叫做 export 的函式,先取出所有的記錄,然後把這些記錄轉變成由字典組成的串列,再透過 json.dumps 轉換成 JSON 格式的字串輸出,傳統的方法如下所示:

import json
from mysite import models
def export(request):
    jsondata = list()
    items = models.Item.objects.all().order_by('item_date')
    for item in items:
        d = dict()
        d['item_date'] = item.item_date.isoformat()
        d['name'] = item.name
        d['category'] = item.category.name
        d['payment_type'] = item.payment_type.name
        d['amount'] = item.amount
        d['description'] = item.description
        jsondata.append(d)
    return JsonResponse(json.dumps(jsondata), safe=False)

此種方式雖然可以把資料順利轉換成 JSON 格式的字串,但是使用者會得到如下所示的,一大堆密密麻麻的原始格式:

雖然使用者可以選擇使用全選功能再複製到文字編輯器存檔,但是畢竟這不是一個好的辦法。因此,在輸出的時候,我們就需要做一些簡單的調整,改為使用 HttpResponse,但是加上一些參數的設定,方法如下:

def export(request):
    jsondata = list()
    items = models.Item.objects.all().order_by('item_date')
    for item in items:
        d = dict()
        d['item_date'] = item.item_date.isoformat()
        d['name'] = item.name
        d['category'] = item.category.name
        d['payment_type'] = item.payment_type.name
        d['amount'] = item.amount
        d['description'] = item.description
        jsondata.append(d)
    response = HttpResponse(json.dumps(jsondata), 
                            content_type='application/force-download')
    response['Content-Disposition'] = 'attachment; filename=export.json'
    return response

也就是先利用 HttpResponse 準備好要輸出的內容,但是並不直接 return,而是放在 response 變數中,然後再把 response 變數加上一個 Content-Disposition 的屬性,並設定它是附件,而且指定檔名為export.json,之後再把 response 回傳給瀏覽器,如此,當執行到這段程式碼的時候,瀏覽器就會把得到的 JSON 格式字串準備成一個可以下載的檔案,並詢問使用者要下載的位置以及是否修改檔名(預設檔名就是export.json),然後就可以順利存檔了。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *