Python Django Web Framework - 13/14. 수정기능

leecw4u·2023년 11월 14일
0

Django

목록 보기
13/15
post-thumbnail

⚽️ 구현 목표

상세보기 페이지에 들어갔을 떄 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}')
...
profile
초보 개발자의 끄적끄적 스터디 블로그

0개의 댓글

관련 채용 정보