이제 각 음식점에서 메뉴를 확인하는 창을 form으로 바꾸고 메뉴를 선택하고, 주소를 입력받으면 Order, Orderfood테이블의 값을 추가해주는 코드를 작성해 보도록 하겠습니다.
우선 menu_list.html을 바꾸어 주도록 하겠습니다.
/fastcampus/order/templates/order/menu_list.html
<form method="post" action="{% url 'order' %}">
<ol>
<h4>1. 주문하실 음식을 골라주세요.</h4>
{% for menu in menu_list %}
<input type="checkbox" id="menu{{ forloop.counter }}" name="menu" value="{{ menu.food_name }}">
<label for="menu{{ forloop.counter }}">{{ menu.food_name }}</label><br />
{% endfor %}
</ol>
<ol>
<h4>2. 집 주소를 알려주세요.</h4>
<input type="text" name="address" required>
</ol>
<input type="hidden" value="{{ shop }}" name="shop">
<input type="submit" value="주문하기">
</form>
여기에서 우선 checkbox 형식으로 menu라는 이름으로 음식 목록을 전달하고, address를 받고 shop이 몇번인지 정보를 hidden으로서 안보이게 해주고 백단으로 전달하였습니다.
/fastcampus/order/views.py
from django.utils import timezone
from django.shortcuts import render
from order.models import Shop, Menu, Order, Orderfood
from order.serializer import ShopSerializer, MenuSerializer
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.parsers import JSONParser
# Shop객체들을 다 serialize한 결과를 json으로 parsing해서 json형태로 이를 반응하겠다
@csrf_exempt
def shop(request):
if request.method == 'GET':
# shop = Shop.objects.all()
# serializer = ShopSerializer(shop, many=True)
# return JsonResponse(serializer.data, safe=False)
shop = Shop.objects.all()
return render(request, 'order/shop_list.html', {'shop_list': shop})
elif request.method == 'POST':
data = JSONParser().parse(request)
serializer = ShopSerializer(data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, status=400)
@csrf_exempt
def menu(request, shop):
if request.method == 'GET':
# get으로 하게 되면 menu1개 밖에 불러오지 못하게 된다.
# 모든 menu를 불러오고 싶을 떄는 배열로서 filter를 사용해 주면 된다.
menu = Menu.objects.filter(shop=shop)
# many=True는 값이 여러개여도 상관하지 않겠다는 의미이다.
# serializer = MenuSerializer(menu, many=True)
# return JsonResponse(serializer.data, safe=False)
return render(request, 'order/menu_list.html', {'menu_list': menu, 'shop': shop})
elif request.method == 'POST':
data = JSONParser().parse(request)
serializer = MenuSerializer(data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=201)
return JsonResponse(serializer.errors, status=400)
@csrf_exempt
def order(request):
if request.method == 'POST':
address = request.POST['address']
shop = request.POST['shop']
food_list = request.POST.getlist('menu')
order_date = timezone.now()
shop_item = Shop.objects.get(pk=int(shop))
order_item = Order.objects.get(pk=shop_item.order_set.latest('id').id)
for food in food_list:
order_item.orderfood_set.create(food_name=food)
shop_item.order_set.create(
order_date=order_date, address=address, shop=int(shop))
return HttpResponse(status=200)
elif request.method == 'GET':
order_list = Order.objects.all()
return render(request, 'order/order_list.html', {'order_list': order_list})
order함수를 작성해 주었는데, address, shop, menu를 받았습니다. 그리고 현재 시간을 받았습니다. 그후에, Order, Orderfood의 데이터를 추가하면 됩니다.
일단 shop_item은 지금 주문하려는 음식점 정보를 담고 있습니다. 그럼 이를 외래키로 가지고 있는 모든 order집합에서 가장 뒤의 id를 가져온다음에 order_item에 집어 넣겠습니다. 그리고 이 order_item을 외래키로 가지고 있는 orderfood집합에 food를 하나씩 집어 넣어 주었습니다.
그리고 마지막으로 shop_item을 외래키로 가조 있는 order집합에 현재 시간, 주소, 가게 정보를 때려박아 주었습니다.
주문을 받는 UI와 주문 결과를 다 확인하는 UI를 확인하면 아래와 같습니다.
이 주문 목록을 확인하는 템플릿은 아래와 같이 작성해 주었습니다.
/fastcampus/order/templates/order/order_list.html
{% for order in order_list %}
<h5>{{ order.shop }}</h5>
<h5>{{ order.order_date }}</h5>
{% endfor %}
/fastcampus/order/urls.py
from django.urls import path
from order import views
urlpatterns = [
path('shops/', views.shop, name="shop"),
path('menus/<int:shop>/', views.menu, name="menu"),
path('order/', views.order, name="order")
]
아직 Ui가 훌륭하지 못하므로 다음 포스팅떄 이를 테이블 형식으로 이쁘게 간단히 꾸미고 넘어가고 추가 기능을 구현하도록 하겠습니다.
'DevOps > AWS Architecture' 카테고리의 다른 글
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - Boss 백엔드 개발 1 (0) | 2022.06.29 |
---|---|
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - Order백엔드 개발 3 (0) | 2022.06.29 |
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - Order백엔드 개발 1 (0) | 2022.06.29 |
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - Models 제작 (0) | 2022.06.28 |
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - Django 기초 - 3 (0) | 2022.06.28 |