Python Django Web Framework - 12/14. DELETE

leecw4u·2023년 11월 10일
0

Django

목록 보기
12/15
post-thumbnail

목표

상세보기 페이지에 들어가면 delete 버튼을 만들어 글을 삭제할 수 있는 기능을 만들어보자. 글을 삭제하면 home으로 돌아온다. 단, home에서는 삭제할 글이 없으므로 버튼이 나타나지 않게 만든다.

CODE

제일 먼저 할 것은 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>
    '''
 ...
profile
초보 개발자의 끄적끄적 스터디 블로그

0개의 댓글

관련 채용 정보