-
장고 생성 기능 구현 2백엔드 : 서버공부/Django 2023. 7. 29. 13:32728x90
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이 찍힌 것을 확인할 수 있습니다.
글을 작성한 뒤에 제출 버튼을 누르면 아래와 같이 method에 post가 보여지는 것을 확인할 수 있습니다.
이제 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