개발일지/Django

Django_CRUD_Update

E-room 2022. 7. 13. 23:34
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