티스토리 뷰

개발공부/Django

13. 수정 기능

_Yunhwan 2022. 4. 26. 21:42

Create + Read 기능을 합친 기능

 

myapp/url.py

from django.contrib import admin
from django.urls import path, include #include를 import
from myapp import views

urlpatterns = [#사용자가 들어온 경로 적기
    path('',views.index),   #view.index로 위임
    path('create/',views.create),
    path('read/<id>/', views.read),
    path('update/<id>/', views.update),#update로 위임
    path('delete/', views.delete)   #delete로 위임
]

view.py

from django.shortcuts import render, HttpResponse, redirect #redirect 추가
from django.views.decorators.csrf import csrf_exempt    #csrf 에러 스킵
nextId = 4
topics = [
    {'id':1, 'title':'routing', 'body':'Routing is ..'},
    {'id':2, 'title':'view', 'body':'View is ..'},
    {'id':3, 'title':'Model', 'body':'Model is ..'},
]

def HTMLTemplate(articleTag, id=None):  #id값을 기본값으로 줘서 에러 방지
    global topics
    contextUI = ''
    if id != None:  #id가 있을 때만 delete 설정
        contextUI = f'''
            <li>
                <form action="/delete/" method="post">  <!-- post방식 사용-->
                    <input type="hidden" name="id" value={id}>  <!--hidden은 눈에 보이지 않지만 전송-->
                    <input type="submit" value="delete">
                </form>
            </li>
            <li><a href="/update/{id}">update</a></li>
        '''
    ol = ''
    for topic in topics:
        ol += f'<li><a href="/read/{topic["id"]}">{topic["title"]}</a></li>'
    return f'''
    <html>
    <body>
        <h1><a href="/">Django</a></h1> <!-- 클릭시 django로 이동-->
        <ul>
            {ol}
        </ul>
        {articleTag}    <!-- articleTag따라 내용 변경 -->
        <ul>
            <li><a href="/create/">create</a></li>
            {contextUI}
        </ul>
    </body>
    </html>
    '''
def index(request):
    article = '''
    <h2>Welcome</h2> 
    Hello, Django
    '''
    return HttpResponse(HTMLTemplate(article))
def read(request, id):
    global topics
    article = ''
    for topic in topics:
        if topic['id'] == int(id):
            article = f'<h2>{topic["title"]}</h2>{topic["body"]}'
    return HttpResponse(HTMLTemplate(article, id))   #id값 인자 추가

@csrf_exempt    #csrf 에러 스킵
def create(request):
    global nextId
    if request.method == 'GET': #GET방식으로 받을 때
        article = '''
            <form action="/create/" method="post">
                <p><input type="text" name="title" placeholder="title"></p>
                <p><textarea name="body" placeholder="body"></textarea></p>
                <p><input type="submit"></p>
            </form>
        '''
        return HttpResponse(HTMLTemplate(article))
    elif request.method == 'POST':  #POST방식으로 받을 때
        title = request.POST['title']
        body = request.POST['body']
        newTopic = {"id":nextId, "title":title, "body":body}    #newTopic 생성
        topics.append(newTopic) #기존 topics에 추가
        url = '/read/'+str(nextId)
        nextId = nextId + 1 #다음을 위해 +1
        return redirect(url)    #create시 생성된 페이지로 이동

@csrf_exempt
def update(request, id):
    global topics
    for topic in topics:
        if topic['id'] == int(id):
            selectedTopic = {
                "title": topic['title'],
                "body": topic['body']
            }
    if request.method == 'GET':
        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['title']   #title, body 값 설정
        body = request.POST['body']
        for topic in topics:
            if topic['id'] == int(id):
                topic['title'] = title
                topic['body'] =body
        return redirect(f'/read/{id}')

@csrf_exempt
def delete(request):
    global topics
    if request.method == 'POST':
        id = request.POST['id']
        newTopics = []
        for topic in topics:    #id와 일치하지 않는 것들 추가
            if topic['id'] != int(id):
                newTopics.append(topic)
        topics = newTopics
        return redirect('/')

화면 실행

'개발공부 > Django' 카테고리의 다른 글

12. DELETE  (0) 2022.04.26
11. 생성기능 (request response object)  (0) 2022.04.26
10. 생성기능(method=GET,POST)  (0) 2022.04.26
9. 생성기능 구현(form)  (0) 2022.04.26
8. 읽기 기능 상세 보기 페이지 만들기  (0) 2022.04.26
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함