Day24 - 以Django Web框架實作永豐API線上支付模擬情境5 - 我的訂單
今天這篇是我們實作庫米狗屋●KummyShop的情境電商模擬的最終章了!今天我們要把先前建的一堆訂單可以在我的訂單頁面呈現出來。
我們預計,可以在裡面看到:
- 訂單排序,新的在最上面
- 訂單會有分頁功能
- 會列出訂單編號、總金額、付款方式、付款狀態、額外資訊或功能(例如可以重新刷卡、顯示ATM轉帳帳號)
- 表格的列依不同狀態區分顏色:失敗為紅色、尚未付款為藍色,只有成功付款才會是白色。
- 將金額加上千位逗號、日期格式化、將原本付款方式、狀態代碼等換成對應的文字
簡化的部份說明
為了專注我們想談的功能,這邊作了很多的簡化,覺得和正式電商相比有缺少之處,都請自行腦補。
- 沒有其他的User,所以也不用分了,所以全店的資料都歸同一個人所有,不用篩選了 (小孩才作選擇!)
- 訂單裡面不會存當時選的商品內容,反正就是一筆一筆的訂單有金額以及當時選擇的付款方式
- 不會多做額外的例外處理防護
那麼就可以開始往下看了。
準備一下取Order的Model
這支程式很簡單,我們需要可以取得以id
來排序的降冪排序,最多回傳100筆資料。
def get_my_orders(top=100):
return Payment.objects.all().order_by('-id')[:top]
程式說明
使用Model的objects.all()
取回所有資料,但使用order_by()
依id
反向排序,作法就是在前面加上一個減號。而取排序後的前top
筆資料,參數預設值為100。
接著在View新增my_orders
在這裡我們需要處理的是取得model中的orders資料,以及加上分頁的機制。我們可使用Django內建的Paginator
模組來快速產生分頁的計算與資料切割,相當方便。
from django.core.paginator import Paginator
def my_orders(request):
page_number = request.GET.get('page', 1)
orders_total = get_my_orders()
paginator = Paginator(orders_total, 10)
page_orders = paginator.page(page_number)
context = {"page_orders": page_orders}
return render(request, 'order/my_orders.html', context)
程式說明
這裡需要使用Paginagor
的類別來裝載我們取回的order資料,並設定其分頁一頁大小,我們設定10筆為一頁。
接著就可以從request傳入一個page
參數來決定等一下返回給Template資料是第幾頁的資料內容,這些全部都交給paginator機制來運算。