티스토리 뷰
[django 쇼핑몰] 주문 마이페이지 Order List API( ListView, order.html, method_decorator, login_required, get_queryset), 전체 urls.py
지휘리릭 2020. 1. 27. 14:39● Order List 주문 페이지
- 자신이 주문한 제품을 확인할 수 있는 마이페이지를 만든다. 주문 Order 객체에서 로그인한 사용자에 해당하는 주문건만 가져와서 화면에 표시하면 된다. 이것 역시 로그인한 사용자만 접근할 수 있도록 method_decorator로 감싼다.
order/views.py
- ListView를 상속받아 주문 목록을 나타낸다. 원래 ListView에서는 'model = ' 값을 설정하여 model 값에 입력된 객체의 정보를 나열한다. 하지만 model = Order를 해버리면 로그인된 사용자 뿐만 아니라 모든 사용자에 대한 주문 정보가 나열된다. 그것을 막기 위해 model 값을 따로 설정하지 않고 get_queryset 함수를 통해서 필터링된 객체만 가져오도록 한다.
- get_queryset 함수는 현재 로그인되어있는 사용자의 정보 (self.request.session.get('user') 값과 사용자 객체의 email 필드 값(user__email) 을 비교하여 두 값이 일치하는 주문서 객체를 가져와서 queryset에 저장한다.
- 필터링한 사용자 객체정보 queryset과 함께 order.html을 렌더링한다. 이 때, order.html 에서 전달받는 객체의 이름은 order_list로 설정한다.
@method_decorator(login_required, name = 'dispatch')
class OrderList(ListView):
template_name = "order.html"
context_object_name = 'order_list'
def get_queryset(self, **kwargs):
queryset = Order.objects.filter(user__email = self.request.session.get('user'))
return queryset
templates/order.html
- 전달받은 주문 목록(order_list)에서 주문(order)을 하나씩 꺼내서 주문 정보를 출력한다.
{% extends 'base.html' %}
{% load humanize %}
{% block contents %}
<div class = "row mt-5">
<div class = "col-12">
<table class = "table table-dark">
<thead class = "thead thead-dark">
<tr>
<td scope = "col">#</td>
<td scope = "col">상품명</td>
<td scope = "col">수량</td>
<td scope = "col">주문날짜</td>
</tr>
</thead>
<tbody class = "text-light">
{% for order in object_list %}
<tr>
<td scope = "col">{{order.id}}</td>
<td>{{order.product}}</td>
<td>{{order.quantity | intcomma}}개</td>
<td>{{order.registered_date | date:'Y-m-d H:i'}}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
{% endblock %}
실행 결과
- four 사용자가 자신의 주문 목록을 확인했을 때 다른 사용자 주문이 포함된 것이 아니라 자신의 것만 표시됐다.
django_shoppingmall/urls.py
from django.contrib import admin
from django.urls import path
from users.views import home, RegisterView, LoginView, logout
from product.views import (
ProductRegister, ProductList, ProductListAPI, ProductDetailAPI, ProductDetailView
)
from order.views import OrderCreate, OrderList
urlpatterns = [
path('admin/', admin.site.urls),
path('', home),
path('register/', RegisterView.as_view()),
path('login/', LoginView.as_view()),
path('logout/',logout),
path('product/register/', ProductRegister.as_view()),
path('product/list/', ProductList.as_view()),
path('product/<int:pk>', ProductDetailView.as_view()),
path('api/product/', ProductListAPI.as_view()),
path('api/product/<int:pk>', ProductDetailAPI.as_view()),
path('order/create/', OrderCreate.as_view()),
path('order/', OrderList.as_view()),
]
'django project > 쇼핑몰' 카테고리의 다른 글
- Total
- Today
- Yesterday
- iOS 데이터베이스
- pythonanywhere배포방법
- CellForRowAt Not Called
- iOS 화면 안나옴
- Firebase 데이터베이스 추천
- django tag
- python 웹 배포
- iOS UITableView 출력안됨
- django 개발일지
- cleaned_data
- ModelForm Form 차이
- 웹 배포
- CellForRowAt 호출안됨
- Realtime Database
- 장고 태그달기
- 까만 화면
- Django
- iOS 검은 화면
- 실시간 데이터베이스
- django 로그인접근
- pythonanywhere배포
- UITableViewController Not Working
- django pythoneverywhere
- django 게시판
- 데이터베이스 추천
- 장고 게시판
- django clean
- 알파벳 카운팅
- django 태그
- 테이블출력안됨
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |