www.youtube.com/watch?v=EX6Tt-ZW0so&list=PL-51WBLyFTg2vW-_6XBoUpE7vpmoR3ztO&index=11
이 포스팅은 다음과 같은 youtube 영상을 따라하면서 배운 내용과 학습 내용을 담은 것이다:
- Dennis Ivy - Create Update & Delete with ModelForms | Django Framework (3.0) Crash Course Tutorials (pt 10)
현재 Django Version 3.1.2 를 쓰고 있다. Django는 파이썬을 쓰는 오픈소스 웹 프레임워크이다. 웹사이트 만들때 주로 쓰며, 간단한 것이 큰 특징이다.
※ Creating forms.py
form은 한개 이상의 field의 묶음을 의미하면, 유저들로부터 정보를 수집하여 서버에 제출하는데 사용된다. forms.py는 이러한 form을 사용하기 편하게 front-end에 보여주기 위해 만드는 file이라고 보면 된다.
# forms.py
from django.forms import ModelForm
from .models import *
class OrderForm(ModelForm):
class Meta:
model = Order
fields = '__all__'
class.Meta는 어떤 모델을 기반으로 폼을 작성할 것인지를 Meta.model에 지정하는 과정이라고 보면 된다. ModelForm의 서브클라스를 만드는 것이므로, model form은 무조건 작업할 model이 필요하다. (Meta가 아닌 다른 이름으로 해도 되지만, 다른 이름을 사용하게 된다면 혼동이 발생할 수 있으므로 Meta라고 Django configuration이 되어 있다.) 만약 class Meta를 넣어주지 않는다면 ValueError이 발생할 것이다.
또한, 여기서 사용할 model은 models.py에 있는 Order이라는 모델을 사용한다는 것을 보여주고 있고, Order 안에 있는 모든 field들을 사용한다고 '__all__'이 나타내주고 있다.
이제 다음과 같이 views.py를 바꿔본다:
# views.py
from django.shortcuts import render, redirect
from django.http import HttpResponse
from .models import *
from .forms import OrderForm
...
def createOrder(request):
form = OrderForm()
if request.method == "POST":
form = OrderForm(request.POST)
if form.is_valid():
form.save()
return redirect('/')
context = {'form':form}
return render(request, 'accounts/order_form.html', context)
이는 우리가 127.0.0.1:8000에 들어가면 볼 수 있는 "Create Order"를 만들기 위한 function이다:
이를 위해 urls.py도 다음과 같이 추가해준다:
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name="home"),
path('products/', views.products, name='products'),
path('customer/<str:pk_customer>/', views.customer, name='customer'),
path('create_order/', views.createOrder, name="create_order"),
]
마지막으로, templates/accounts/ 에 order_form.html 이라는 파일을 추가해준다:
<!-- order_form.html -->
{% extends 'accounts/main.html' %}
{% load static %}
{% block content %}
<div class="row">
<div class="col-md-6">
<div class="card card-body">
<form action="" method="POST">
{% csrf_token %}
{{form}}
<input type="submit" name="Submit">
</form>
</div>
</div>
</div>
{% endblock%}
여기서 method="POST"는 우리가 무엇인가 제출할때 (아이디, 비밀번호 등)를 POST하는 과정이라고 한다. POST 이외에도 GET도 있는데, GET의 경우는 우리가 웹사이트의 백엔드에서 어떤 데이터를 불러올때 GET이 포함되어 있다.
이러한 POST method에는 무조건 csrf_token 이라는 것이 추가되어야 하는데, 이를 통해 POST하면서 해커의 방지, 그리고 유저가 정보를 가지고 원치 않는 행동을 하는 것을 막아주는 것이다.
{{form}}은 앞선 포스팅에서 설명했듯이, createOrder function에 context = {'form':form} 덕분에 form(=OrderForm)을 불러온다.
이제 홈페이지의 "Create Order"를 누른다면 다음과 같은 화면이 나온다:
OrderForm에서 Order의 모든 field들을 불러오기로 했으므로, Order의 모든 field인 customer, Product, Status가 불러와진다.
또한, views.py에 if request.method=="POST": 부분을 보면, 이 "Create Order"에 들어온 후 customer, product, status를 입력을 하면, database에 저장(form.save())가 되는 것을 알 수 있다.
※ Update & Delete
이제 위에 했던 방식을 응용하여 Update과 Delete를 하는 것을 만들어 볼 것이다:
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name="home"),
path('products/', views.products, name='products'),
path('customer/<str:pk_customer>/', views.customer, name='customer'),
path('create_order/', views.createOrder, name="create_order"),
path('update_order/<str:pk_updateOrder>/', views.updateOrder, name="update_order"),
path('delete_order/<str:pk_deleteOrder>/', views.deleteOrder, name="delete_order"),
]
urls.py는 위와 같이 바꿔주고, viwes.py는 다음을 추가해준다:
# views.py
from django.shortcuts import render, redirect
from django.http import HttpResponse
from .models import *
from .forms import OrderForm
...
def updateOrder(request, pk_updateOrder):
order = Order.objects.get(id=pk_updateOrder)
form = OrderForm(instance=order)
if request.method == "POST":
form = OrderForm(request.POST, instance=order)
if form.is_valid():
form.save()
return redirect('/')
context = {'form':form}
return render(request, 'accounts/order_form.html', context)
def deleteOrder(request, pk_deleteOrder):
order = Order.objects.get(id=pk_deleteOrder)
if request.method == 'POST':
order.delete()
return redirect('/')
context = {'item':order}
return render(request, 'accounts/delete.html', context)
여기서 pk_updateOrder과 pk_deleteOrder는 저번 포스팅에서 언급을 했으므로 다시 언급하지는 않겠다. 여기서 이제 우리가 봐야할 것은 updateOrder function에서 form=OrderForm(instance=order) 인 부분인데, 여기서 instance=order는:
- order = Order.objects.get(id=pk_updateOrder) 을 통해 id=pk_updateOrder인 order를 찾고,
- OrderForm에 이 특정 order를 대입해주고 form으로 정의한다
이다. 이를 통해, 웹사이트의 Update 버튼을 클릭하게 될 경우, 그 특정 id=pk_updateOrder를 가진 customer의 주문이 미리 입력되어 있을 것이다:
또한, field의 product, status, customer 값들을 변경하고 제출버튼을 누르게 될 경우, 만약 정상적인 form이라면 (if form.is_valid()), 원래의 홈페이지로 redirect를 해줄 것이다.
DeleteOrder도 비슷한 개념이므로 따로언급하지는 않겠다.