상세보기 페이지에 들어갔을 떄 update를 누르면 우리가 선택한 글을 내용이 폼에 들어가 있고 제출하면 데이터가 변경되고 변경된 토픽에 대한 페이지로 이동하는 기능을 구현해보자.
상세보기 페이지에 들어갔을 때 update 버튼이 보여야 하므로,HTMLTemplate
를 수정해주도록 한다. 또한 어떤 상세보기 페이지를 바꿀 것인지 알아야 함으로 id
값을 인자로 넣어주도록 한다.
...
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>
<li><a href="/update/{id}">update</a></li>
'''
...
update를 누르면 다른 페이지를 이동을 해줘야 한다. 따라서 라우팅 설정을 위해 urls.py
를 수정해주도록 한다.
from django.urls import path
from myapp import views
urlpatterns = [
path('', views.index),
path('create/', views.create),
path('read/<id>/', views.read),
path('delete/', views.delete),
path('update/<id>/', views.update),
]
다시 views.py
에 돌아와 update
함수를 만들어 기능을 완성하도록 한다.
create와 마찬가지로 GET
으로 들어올 때와 POST
로 들어올때를 나눠줬다.
GET
으로 들어왔을 때 상세보기 페이지의 title과 body가 보이고 우리가 수정하게 끔 내용이 그 안에 들어있어야 한다. 따라서 topics
를 가져와 우리가 수정하고 싶은 id
를 찾아 title과 body의 정보를 알아내 보여주도록 한다.
update 페이지에서 내용을 수정하고 제출하면 POST
로 동작하도록 한다.
topics에 title과 body에 새로운 내용을 담고 상세보기 페이지로 넘어가게 해준다.
...
@csrf_exempt
def update(request, id):
global topics
if request.method == 'GET':
for topic in topics:
if topic['id'] == int(id):
selectedTopic = {
"title":topic['title'],
"body":topic['body']
}
article = f'''
<form action="/update/{id}/" method="post">
<p><input type="text" name="title" placeholder="title" value={selectedTopic["title"]}></p>
<p><textarea name="body" placeholder="body">{selectedTopic['body']}</textarea></p>
<p><input type="submit"></p>
</form>
'''
return HttpResponse(HTMLTemplate(article, id))
elif request.method == 'POST':
title = request.POST['tilte']
body = request.POST['body']
for topic in topics:
if topic['id'] == int(id):
topic['title'] = title
topic['body'] = body
return redirect(f'/read/{id}')
...