Django CRUD - 4. Update

Mingi Shin·2023년 2월 10일
0

CRUD

목록 보기
5/11

마지막 Update 기능을 추가할 것이다.

read/~~ 로 이동하면 update 버튼을 눌러 기존에 있었던 title, body를 수정해서 update 해주는 간단한 기능이다.


1. 링크 생성

read/~~ 페이지에 update 버튼이 뜬다. /sjuu/update/id로 이동하니까 urls.py를 수정해준다.


2. URL 매핑

URL 매핑은 완료되었다.


3. Views

update 함수도 GETPOST를 분리해서 처리해야 한다. 최초 update 버튼은 GET 방식일 것이고, 수정을 완료해서 제출버튼을 눌르르면 POST 방식일 것이다.

GET method

GET방식부터 작성하자.

id값이 일치하면 그 것으로 article을 만든다.

value를 지정해 버튼을 누르자마자 기존에 있던 데이터가 얹어져 있게 했다.

POST method

GET 페이지에서 새로 작성한 title, body를 불러와서 semesters에 입혀준다. 그리고 url은 /sjuu/read/(업데이트한 id)/ 로 이동하게 해준다.

오류가 뜨는데 아무래도 각각에 name 속성을 지정해주지 않아서 뜬 거 같다.


4. Update 해보기

read/7을 업데이트 해보자

id가 7인 데이터의 title과 body를 수정해봤다. 제출을 누르면

업데이트된 값이 적용된 /sjuu/read/7 페이지로 이동한다.


5. 코드

@csrf_exempt
def update(request, id):
    global semesters
    
    if request.method == "GET":
        for i in semesters:
            if i["id"] == int(id):
                Up = {"title": i["title"], "body": i["body"]}
                break
            
        article = f'''
                <form action="/sjuu/update/{id}/" method="post">
                    <p><input type="text" name="title" value={Up["title"]}></p>
                    <p><textarea name="body">{Up["body"]}</textarea></p>
                    <p><input type="submit"></p>
                </form>
                '''
        return HttpResponse(baseHTML(article, id))
    
    elif request.method == "POST":
        title = request.POST["title"]
        body = request.POST["body"]
        
        for i in semesters:
            if i["id"] == int(id):
                i["title"] = title
                i["body"] = body
                
        return redirect(f'/sjuu/read/{id}/')

6. 보완점

아주 간단한 CRUD를 완성했다. 너무 간단해서 보완할 것도 많다.

  • 서버를 새로킬 때마다 초기 상태의 데이터를 불러오는 문제
  • 10개의 데이터가 있다고 가정할 때, id가 7인 값을 삭제해도 여전히 nextID가 11인 문제
  • view 함수에 모든 HTML 파일을 집어 넣어 보수, 관리가 힘든점.

장고의 DB를 활용해 영구적인 데이터로 관리하게 해야 한다.
장고의 Model을 활용해 데이터베이스에 접근하게 해야 한다.
Template에 HTML 관련 코드를 모아 효율적으로 관리해야 한다.

profile
@abcganada123 / git:ABCganada

0개의 댓글