728x90
마지막으로 Update 기능을 구현해보자.
delete버튼처럼 상세보기 페이지(read)로 들어가면 update버튼이 나타나고
이를 클릭하면 수정하는 창이 생긴다. 그 창에는 기존 정보들이 들어있고
제출을 클릭하면 수정한 정보로 바뀌며 해당 상세보기페이지로 간다.
가장 복잡하긴 하지만 이전에 공부한 CRD를 잘 활용하면 충분히 만들 수 있다.
먼저 상세보기페이지로 접속했을 때, 버튼이 생성되게 해 보자
delete_btn = ''
if id != None:
delete_btn = f'''
<li><a href="/update/{id}">update</a></li> # 기존에 만들어 두었던 delete버튼에 추가
<li> # 글 수정을 위해 id값을 가지고 접속한다
<form action="/delete/" method="POST">
<input type="hidden" name="id" value={id}>
<input type="submit" value="delete">
</form>
</li>
'''
뭔가 delete_btn이라는 이름이 마음에 안 드니 이름도 바꿔주었다
(delete_btn이라는 이름을 3번 사용했음 아래 코드에 2개, html본체에 1개 더 있음)
mybtn = ''
if id != None:
mybtn = f'''
<li><a href="/update/{id}">update</a></li>
<li>
<form action="/delete/" method="POST">
<input type="hidden" name="id" value={id}>
<input type="submit" value="delete">
</form>
</li>
'''
저장 후 실행해보면 버튼이 잘 생성되었고
버튼을 눌러보면 에러가 발생하기는 하나 id값을 가지고 잘 넘어오는 것을 볼 수 있다.
이제 myapp의 urls.py에서 서버 작업을 해주자
서버로 넘어가서 update함수로 위임해 주었다
urlpatterns = [
path('', views.index),
path('create/', views.create),
path('read/<id>/', views.read),
path('update/<id>/', views.update), # 서버는 read와 구조가 동일
path('delete/', views.delete)
]
이제 update 함수를 구현해보자
update버튼을 클릭하면 update창이 생기고 ( GET )
제출 버튼을 누르면 정보가 수정된다. ( POST )
구조가 create와 비슷한 것 같아 보인다.
create를 그대로 가져와 몇 가지만 수정하면 될 것 같다.
먼저 GET부분부터 구현해보자
@csrf_exempt # POST 구현할 때 필요, 그냥 미리 가져옴
def update(request, id): # 어떤 정보를 수정할지 판단해야하므로 id값 필요
global topics # 수정할 정보를 input칸과 textarea칸에 찍어줄때 하므로 전역변수 선언
if request.method == "GET":
for topic in topics: # for문과 if문을 통해 해당 id의 정보를 찾는다.
if topic["id"] == int(id):
title = topic["title"]
body = topic["body"]
article = f'''
<form action="/update/{id}/" method="POST"> # create와 차이점 id값을 가져가야함
<p><input type="text" name="title" placeholder="title" value="{title}"></p>
<p><textarea placeholder="body" name="body">{body}</textarea></p>
<p><input type="submit"></p>
</form> # input에는 value값으로 title을 주고, textarea는 칸 안에 body를 주어
''' # update를 눌렀을 때 해당정보가 표시되게한다.
return HttpResponse(HTMLTemplate(article, id))
다음은 POST
elif request.method == "POST":
title = request.POST["title"] # GET창에서 POST로 전송한 데이터를 받는다
body = request.POST["body"]
for topic in topics: # for문과 if문을 통해 일치하는 id값을 찾는다
if topic["id"] == int(id):
topic["title"] = title # 일치한 id값의 데이터들을 변경해준다.
topic["body"] = body
return redirect(f'/read/{id}') # 수정후 해당 상세보기페이지로 돌아간다
실행해보면
잘 되는 것을 볼 수 있다.
Youtube 생활코딩님의 수업 영상을 보고 복습을 위해 작성한 글입니다.
728x90
'개발일지 > Django' 카테고리의 다른 글
Django_CRUD_Delete (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 |