삭제 기능을 구현해보자
"""
게시글을 누르면 삭제 버튼이 나타난다.
삭제 버튼을 누르면 해당 게시글은 삭제된다.
홈으로 이동한다.
"""
우선 삭제 버튼을 만들어 보자
버튼을 누르면 해당 링크로 이동하는 것이 아닌 버튼을 누르자마자
서버의 데이터를 변경하는 것이기 때문에 POST방식으로 접근해야 한다.
그리고 이를 사용하기 위해 <form>을 사용한다.
def HTMLTemplate(articleTag):
global topics
ol = ''
for topic in topics:
ol += f'<li><a href="/read/{topic["id"]}">{topic["title"]}</a></li>'
return f'''
<html>
<body>
<h1><a href="/">Django</a></h1>
<ul>
{ol}
</ul>
{articleTag}
<ul>
<li><a href="/create/">create</a></li>
<li>
<form action="/delete/" method="POST"> # form을 사용하여 POST방식으로 접근
<input type="submit" value="delete">
</form>
</li>
</ul>
</body>
</html>
'''
이제 무엇을 삭제할지를 전달해 주어야 한다
read페이지의 HTMLTemplate를 통해서 들어올 때, id값을 전달해주도록 하자.
def read(request, id):
global topics
for topic in topics:
if topic['id'] == int(id):
article = f'''
<h2>{topic['title']}</h2>
{topic['body']}
'''
return HttpResponse(HTMLTemplate(article, id)) # id 값 추가
이제 이 id값을 받는 파라미터로 HTMLTemplate함수의 두 번째 위치에서 받아준다.
def HTMLTemplate(articleTag, id=None):
(이때 id=None이라고 해준 이유는
id 값이 없는 다른 페이지들이 존재하기 때문에 기본값을 주지 않으면
2번째 인자의 값을 요구하는 에러가 발생할 수 있다.
그래서 기본값을 None으로 주었다.)
받은 id 값을 delete에 전달해 주기 위하여 다음과 같이 작업해준다.
<form action="/delete/" method="POST">
<input type="hidden" name="id" value={id}> # type을 hidden으로 설정하여 눈에 보이지 않는
<input type="submit" value="delete"> # 장치를 생성
</form>
delete함수로 안내하기 위해 서버 쪽 작업을 해보자
myapp의 urls.py에 path를 추가한다.
urlpatterns = [
path('', views.index),
path('create/', views.create),
path('read/<id>/', views.read),
path('delete/', views.delete)
]
path가 안내해준 경로로 이동해 실행할 함수를 생성한다.
우선 데이터가 잘 전송되는지 테스트를 해보자
@csrf_exempt # create와 같은 이유
def delete(request):
if request.method == "POST": # 전송받은 데이터가 POST방식인지 확인하기 위해
print('포스트입니다.')
print(request.POST["id"])
실행되는지 테스트해보면 에러가 발생하긴 하지만 터미널 창에 '포스트입니다'라는 메시지와 id값이 잘 출력된다.
이제 실제 작동을 위한 코드를 만들어 보자
@csrf_exempt
def delete(request):
if request.method == "POST": # 요청이 POST 방식인지 검사한다
id = request.POST["id"]
global topics # topics를 사용하기 위해 전역변수로 설정
New_topics = [] # 새로운 topics를 만들기 위해 이를 담을 변수 생성
for topic in topics:
if topic['id'] != int(id): # for문을 돌려 현재 id값과 저장된 데이터들의 id값이
New_topics.append(topic) # 일치하지 않는다면 New_topics로 보낸다
topics = New_topics # topics를 New_topics로 바꾸어 준다 (요청된 id값은 빠져있게 된다)
return redirect('/') # 리턴값으로 홈화면을 돌려준다
delete 함수에 POST 방식으로 요청이 들어오면 id값을 설정하고 topics의 데이터들과 비교하여
일치하지 않는다면 새로운 리스트에 추가되고 (삭제할 데이터의 id값이 들어오기 때문에)
기존의 리스트를 새로운 리스트로 변경해주고 홈 화면으로 이동
테스트해보면 해당 데이터를 삭제한 뒤 홈 화면으로 돌아온다
마지막으로 delete 버튼을 상세보기 페이지(read)에서만 보이게 변경해보자.
해당 페이지가 상세보기 페이지인지 판단하려면 id값이 있는지 판단하여 보여주면 된다.
delete_btn = ''
if id != None:
delete_btn = f'''
<li>
<form action="/delete/" method="POST">
<input type="hidden" name="id" value={id}>
<input type="submit" value="delete">
</form>
</li>
'''
return f'''
<html>
<body>
<h1><a href="/">Django</a></h1>
<ul>
{ol}
</ul>
{articleTag}
<ul>
<li><a href="/create/">create</a></li>
{delete_btn}
</ul>
</body>
</html>
'''
Youtube 생활코딩님의 수업 영상을 보고 복습을 위해 작성한 글입니다.
'개발일지 > Django' 카테고리의 다른 글
Django_CRUD_Update (0) | 2022.07.13 |
---|---|
Django_CRUD_Create (0) | 2022.07.13 |
Django_CRUD_Read (0) | 2022.07.12 |
Django - app, Routing (0) | 2022.07.11 |
Django (0) | 2022.07.11 |