티스토리 뷰

  ● 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()),
]
댓글