ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 장고 생성 기능 구현 2
    백엔드 : 서버공부/Django 2023. 7. 29. 13:32
    728x90

    view.py에서 구현한 함수를 살펴보겠습니다.

    사용자 요청이들어오면 요청을 장고가 받습니다.

    장고는 사용자의 요청에 포함된 여러가지 정보들을 분석해서, 만들어둔 create함수를 장고가 호출합니다.

    호출한 후 첫번째 파라미터의 인자로 HttpRequest라는 객체를 만드는데 그 객체안에 사용자의 요청과 관련된 여러가지 정보들을 패키징한 정보를 객체란 형태로 만들어 우리에게 공급합니다.

    우리는 request를 분석해서 처리를 하는 코드를 작성하고, HttpRespinse라는 객체를 응답해주면 그 정보가 장고에 의해서 사용자의 브라우저로 전달되게 되는 것 입니다.

    https://docs.djangoproject.com/en/4.2/ref/request-response/를 살펴보면 request.method를 통해서 사용자가 Get방식으로 접속했는지, Post방식으로 접속했는지를 알수있다는 것을 알 수 있습니다.

    아래와 같은 코드를 create 함수에 추가해 줍니다.

    print('request.method',request.method)
    

    페이지에서 create링크를 클릭하면

    method에 GET이 찍힌 것을 확인할 수 있습니다.

     

    글을 작성한 뒤에 제출 버튼을 누르면 아래와 같이 methodpost가 보여지는 것을 확인할 수 있습니다.

    이제 request.method를 이용해서 POST의 처리와 GET의 처리를 분류할 수 있게되었습니다.

     

    아래와같이 코드를 수정해 줍니다.

    from django.shortcuts import render, HttpResponse
    from django.views.decorators.csrf import csrf_exempt
    
    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):
        global topics
        ol = ''
        for topic in topics:
            ol += f'<li><a href="read/{topic["id"]}">{topic["title"]}</a></li>'
        return f'''
        <html>
        <body>
            <h1><a href="/myapp">Django</a></h1>
            <ol>
                {ol}
            </ol>
            {articleTag}
            <ul>
                <li><a href="/myapp/create/">create</a></li>
            </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))
    
    @csrf_exempt
    def create(request):
        global nextId
        print('request.method',request.method)
        if request.method == 'GET':
            article = '''
        		<form action="/myapp/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':
            title = request.POST['title']
            body = request.POST['body']
            newTopic = {"id":nextId, "title":title, "body":body}
            topics.append(newTopic)
            return HttpResponse(HTMLTemplate('AAA'))
    

    POST방식에대해서 newTopic을 만들어 topics에 append방식으로 추가하였고 global nextId라는 전역변수를 사용해 리스트에 추가했습니다.

    페이지를 로드한뒤 create버튼을 눌러 글을 추가해주면 아래와같이 리스트에 글 목록이 추가되는 것을 확인 할 수 있습니다.

    하지만 여전히 문제가 있습니다. 글을 계속 작성해도 추가된 글들의 id는 4가됩니다. 전역변수를 사용하고 있기 때문입니다. 이를 해결하기 위해 코드를 아래와 같이 한번 더 수정해 줍니다.

    def create(request):
        global nextId
        print('request.method',request.method)
        if request.method == 'GET':
            article = '''
        		<form action="/myapp/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':
            title = request.POST['title']
            body = request.POST['body']
            newTopic = {"id":nextId, "title":title, "body":body}
            topics.append(newTopic)
            nextId+=1
            return HttpResponse(HTMLTemplate('AAA'))
    

    nextId+=1 라는 코드를 작성해서 값을 추가한 다음에는 id값을 1 증가시켜주어야 합니다.

     

    다시 페이지를 로드해 글들을 작성해보면 아이디값이 1씩 증가하며 추가되는 것을 확인 할 수 있습니다.

    이제는 작업을 끝내고 return HttpResponse(HTMLTemplate('AAA')) 와 같은 의미없는 정보를 화면에 화면에 출력하는 것이 아니라 서버가 웹브라우저에게 **“현재 생성한 글의 상세보기 페이지로 이동하라”**라는 명령 즉 Redirect하라 라는 명령을 해야합니다.

     

    아래와 같이 코드를 수정해 줍니다.

    @csrf_exempt
    def create(request):
        global nextId
        print('request.method',request.method)
        if request.method == 'GET':
            article = '''
        		<form action="/myapp/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':
            title = request.POST['title']
            body = request.POST['body']
            newTopic = {"id":nextId, "title":title, "body":body}
            topics.append(newTopic)
            url = '/myapp/read/'+str(nextId)
            nextId+=1
            return redirect(url)
    

    다시 페이지를 로드해서 글을 작성해보면 새로운 페이지가 생성되고, 그 페이지의 고유한 id값을 갖고있는 페이지로 이동합니다.

    글을 하나더 추가해보겠습니다.

    위와 같이 고유한 아이디값을 갖는 새로운글이 잘 추가되는 것을 확인할 수 있습니다.

     

    '백엔드 : 서버공부 > Django' 카테고리의 다른 글

    장고 수정 기능 구현  (0) 2023.07.31
    장고 삭제 기능 구현  (0) 2023.07.29
    장고 생성 기능 구현 1  (0) 2023.07.29
    장고 읽기 구현 2  (0) 2023.07.29
    장고 읽기 구현 1  (0) 2023.07.29
Designed by Tistory.