오늘 할 일
Create를 클릭했을 때, 주소가 create로 이동하며 articleTag 자리에 create 창이 생성되고 제출을 클릭하면
글이 생성되고 생성된 글의 상세보기로 이동하는 기능을 만든다.
Create 기능을 만들기 위해서 우선 Create버튼을 만들어 보자
클릭해보면 create페이지로 잘 이동하는 것을 볼 수 있다.
<html>
<body>
<h1><a href="/">Django</a></h1>
<ul>
{ol}
</ul>
{articleTag}
<ul>
<li><a href="/create/">create</a></li> # 새롭게 생성한 버튼
</ul>
</body>
</html>
create페이지로 이동하는 대신 articleTag 자리에 create 창이 생기도록 해보자
def create(request):
article = '''
<form action="/create/">
<p><input type="text" name="title" placeholder="title"></p>
<p><textarea placeholder="body" name="body"></textarea></p>
<p><input type="submit"></p>
</form>
'''
return HttpResponse(HTMLTemplate(article))
그리고 아무 글이나 입력 후 제출 버튼을 눌러보자
요청 메서드가 GET이고
주소창을 보면 본인이 입력한 정보가 포함되어 있음을 알 수 있다.
만약 이렇게 되면 누군가 이 주소를 인스타나 트위터에 공유를 했을 경우
사람들이 공유한 페이지를 클릭할 때 마다 글이 생성될 것이다.
이것을 방지하기 위해 POST 방식이란 것을 사용하자
기본적으로 아무것도 입력하지 않으면 GET방식이다
article = '''
<form action="/create/" method="POST"> # method="POST"를 추가
<p><input type="text" name="title" placeholder="title"></p>
<p><textarea placeholder="body" name="body"></textarea></p>
<p><input type="submit"></p>
</form>
'''
다시 눌러보면
에러가 발생하긴 했지만
POST방식으로 바뀌었고 주소창에 정보가 포함되지 않는다.
'''
해당 에러창은 Django의 보안 기능인데 여기서는 다루지 않는다.
그러므로 간단하게 우회하는 법으로 넘어가자
from django.views.decorators.csrf import csrf_exempt # 임포트 해준다
@csrf_exempt # 에러가 발생하는 함수 위에 작성해준다
def example():
print("예시입니다.")
'''
이제 사용자의 요청이 GET인지 POST인지 알아내 보자
request.method함수를 활용한다.
@csrf_exempt
def create(request):
print(request.method) # create 함수가 작동할 때 method가 어떤 방식인지 프린트해준다
article = '''
<form action="/create/" method="POST">
<p><input type="text" name="title" placeholder="title"></p>
<p><textarea placeholder="body" name="body"></textarea></p>
<p><input type="submit"></p>
</form>
'''
return HttpResponse(HTMLTemplate(article))
create버튼을 누르면 터미널 창에 GET이라고 찍히고
제출 버튼을 누르면 터미널 창에 POST라고 찍힌다.
request.method함수를 이용해서 요청 방식을 나누어준다.
@csrf_exempt
def create(request):
if request.method == "GET":
article = '''
<form action="/create/" method="POST">
<p><input type="text" name="title" placeholder="title"></p>
<p><textarea placeholder="body" name="body"></textarea></p>
<p><input type="submit"></p>
</form>
'''
return HttpResponse(HTMLTemplate(article))
elif request.method == "POST":
return HttpResponse("POST입니다")
request.POST
사용자가 POST방식으로 전송한 정보를 받는 방법이다.
아래와 같이 코드를 추가하고 아무 정보나 입력한 뒤 제출하고
터미널 창에 어떤 식으로 print 되는지 본다
elif request.method == "POST":
print(request.POST)
return HttpResponse("POST입니다")
아래와 같은 형식으로 출력이 되었을 것이다.
그렇다면 여기서 정보를 뽑아낼 수 있지 않을까?
elif request.method == "POST":
print(request.POST["title"])
print(request.POST["body"])
return HttpResponse("POST입니다")
터미널 창을 보면 잘 출력된다.
이를 활용하여 딕셔너리 형태를 만들어 topics에 append함수로 전달해주자.
elif request.method == "POST":
global topics # topics를 사용하기 위해 전역변수 선언
title = request.POST["title"]
body = request.POST["body"]
New = {"title":title, "body":body}
topics.append(New)
return HttpResponse("POST입니다")
그런데 작성하고 topics를 보니 id값이 있다.
이 id값을 지정해주기 위해 가장 간단한 방법을 사용해보자
Now_id를 생성하고
Now_id = 4 # 현재 topics의 갯수가 4개 이므로 4
topics = [
{'id':1, 'title':'Create', 'body':'Create is ..'},
{'id':2, 'title':'Read', 'body':'Read is ..'},
{'id':3, 'title':'Update', 'body':'Update is ..'},
{'id':4, 'title':'Delete', 'body':'Delete is ..'}
이를 id값 지정에 활용
elif request.method == "POST":
global topics
global Now_id # Now_id를 사용하기 위해 전역변수 선언
title = request.POST["title"]
body = request.POST["body"]
Now_id += 1 # 글을 게시전 id값이기 때문에 1을 더해준다.
New = {"id":Now_id, "title":title, "body":body} # topics의 양식에 맞게 id값 추가
topics.append(New) # 새로 생성한 정보를 topics에 전달
return HttpResponse("POST입니다")
저장 후 정보를 입력 후 사용해보면 잘되는 것을 볼 수 있다.
이제 제출 후 제출한 정보의 상세페이지란으로 이동하는 기능을 만들어 본다.
이를 위해 redirect 함수를 활용한다.
사용을 위해 import 항목에 추가하고
생성되는 즉시 (read/생성한 id값)으로 이동한다.
elif request.method == "POST":
global topics
global Now_id
title = request.POST["title"]
body = request.POST["body"]
Now_id += 1
New = {"id":Now_id, "title":title, "body":body}
topics.append(New)
return redirect(f'/read/{Now_id}') # redirect 함수를 사용
정보를 입력하고 제출하면 바로 생성된 페이지로 이동하는 것을 볼 수 있다.
Youtube 생활코딩님의 수업 영상을 보고 복습을 위해 작성한 글입니다.
'개발일지 > Django' 카테고리의 다른 글
Django_CRUD_Update (0) | 2022.07.13 |
---|---|
Django_CRUD_Delete (0) | 2022.07.13 |
Django_CRUD_Read (0) | 2022.07.12 |
Django - app, Routing (0) | 2022.07.11 |
Django (0) | 2022.07.11 |