상세보기 페이지에 들어가면 delete 버튼을 만들어 글을 삭제할 수 있는 기능을 만들어보자. 글을 삭제하면 home으로 돌아온다. 단, home에서는 삭제할 글이 없으므로 버튼이 나타나지 않게 만든다.
제일 먼저 할 것은 delete 버튼을 만드는 것이다.
여기서 delete 버튼을 누르면 서버랑 통신아여 바로 데이터를 바꿔줘야 하므로 POST
방식을 사용해야 한다.
따라서 form을 사용하고 delete 버튼을 누르면 /delete로 이동하게 한다.
추가로, 우린 몇 번째 글을 삭제할지 알려줘야 한다. 그래서 read 함수에 HTMLResponse, HTMLTemplate의 두번째 인자로 id 값을 넣어줄 것이다. 그리고 HTMLTemplate함수에 두번째 인자를 받을 수 있도록 id를 추가해준다.
...
def HTMLTemplate(articleTag):
...
<ul>
<li><a href="/create/">create</a></li>
<li>
<form action="/delete/" method="post">
<input type="submit" value="delete">
</form>
</li>
</ul>
...
하지만 여기서 문제가 생긴다 index, create 같은 함수는 id값을 두번째 인자로 받을 필요가 없다. 따라서 default값으로 None을 준다.
...
def HTMLTemplate(articleTag, id=None):
...
이제 id 값을 서버로 전송해야 한다. 그러기 위해 눈에는 보이지 않지만 서버로 id 값을 전송해주는 hidden을 써서 전송시킨다.
...
<li>
<form action="/delete/" method="post">
<input type="hidden" name="id" value={id}>
<input type="submit" value="delete">
</form>
</li>
...
보내주는 것을 완료했으니 이제 서버 받는쪽을 작업해야 한다.
그러기 위해 myapp에 있는 urls.py에 path를 추가해준다.
...
urlpatterns = [
path('', views.index),
path('create/', views.create),
path('read/<id>/', views.read),
path('delete/', views.delete),
]
...
views.py에서 delete함수를 만들어준다.
csrf 에러를 스킵하기 위해 데코레이터를 사용하고 id와 일치하지 않는 값이면 newTopics에 저장해준다.
반복문 이후에 topics에 newTopics를 저장하고 home으로 이동시킨다.
...
@csrf_exempt
def delete(request):
global topics
if request.method == 'POST':
id = request.POST['id']
newTopics = []
for topic in topics:
if topic['id'] != int(id):
newTopics.append(topic)
topics = newTopics
return redirect('/')
...
다만 아직은 home에서 delete버튼이 나타나고 있다.
따라서 HTMLTemplate에 id 값이 있을 때만 delete 버튼이 나오게 한다.
def HTMLTemplate(articleTag, id=None):
global topics
contextUI = ""
if id != None:
contextUI = f'''
<li>
<form action="/delete/" method="post">
<input type="hidden" name="id" value={id}>
<input type="submit" value="delete">
</form>
</li>
'''
...
<html>
...
<li><a href="/create/">create</a></li>
{contextUI}
</ul>
</body>
</html>
'''
...