특정 게시물 삭제도 todo 모델 데이터의 id값을 알아야 해당 데이터를 데이터베이스에서 통째로 삭제할 수 있다.
[todo/views.py/delete함수]
@csrf_exempt
def delete(request, todo_id):
if request.method == 'POST': # 데이터 생성,수정,삭제는 POST 읽기만 GET
detailed_todo = Todo.objects.get(id=todo_id)
detailed_todo.delete()
return redirect("/todo/")
else:
return HttpResponse("Invalid request method", status=405)
[todo/urls.py/]
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
path('todo/', views.todo),
path('todo_create/', views.create),
path('todo/<int:todo_id>/', views.read),
path('todo/delete/<int:todo_id>/', views.delete),
]
ThunderClient로 1번 게시물을 지워보겠다.
잘 삭제되는 것을 볼 수 있다.
이번에는 삭제버튼을 만들어서 페이지에서 직접 삭제가 가능하도록 해보겠다.
todo 추가하기 버튼도 만들어보자.
[templates/todo/detail.html]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Todo!!</title>
</head>
<body>
<h1>{{detailed_todo.id}}번째 Todo!!</h1>
<h3>[ {{detailed_todo.content}} ]</h3>
<p>생성시각 : {{detailed_todo.created_at}}</p>
<p>수정시각 : {{detailed_todo.updated_at}}</p>
<form action="/todo/delete/{{todo_id}}/" method="POST">
{% csrf_token %}
<button> 삭제하기 </button>
</form>
<a href="/todo/">
<button>Todo List로 돌아가기<button>
</a>
</body>
</html>
[templates/todo/todo_list.html]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>알렉스의 ToDo List</title>
</head>
<body>
<h1> Alex's ToDo List </h1>
<a href="/todo_create/">
<button>todo 추가하기</button>
</a>
<ul>
{% for todo in todos %}
<a href="/todo/{{ todo.id }}/">
<li>
<div>
{{ todo.content }}
</div>
</li>
</a>
{% endfor %}
</ul>
</body>
</html>
데이터 삭제는 POST!! HTML 폼을 서버에 보내서 데이터베이스의 변화를 주기 때문에 <form></form>
태그에 input 요소를 담는다.
삭제버튼으로 다 지웠다.
데이터베이스에도 데이터가 지워진 것을 볼 수 있다.
추가하기 버튼을 누르면 '/todo/'로 이동하도록 해보자.
[todo/views.py/create 함수 Before]
@csrf_exempt
def create(request):
if request.method == "POST":
Todo.objects.create(content=request.POST["content"])
return HttpResponse('todo 생성!')
elif request.method == "GET":
return render(request, 'todo/create.html')
else:
return HttpResponse("Invalid request method", status=405)
[todo/views.py/create 함수 After]
@csrf_exempt
def create(request):
if request.method == "POST":
Todo.objects.create(content=request.POST["content"])
return redirect('/todo/')
elif request.method == "GET":
return render(request, 'todo/create.html')
else:
return HttpResponse("Invalid request method", status=405)