컴굥일지
[Django Study 05] Model, DB 연동, HTTP 프로토콜(GET, POST), DB 데이터 저장 본문
[Django Study 05] Model, DB 연동, HTTP 프로토콜(GET, POST), DB 데이터 저장
gyong 2022. 4. 14. 00:05[Model, DB 연동 - makemigrations, migrate]
model : 장고에서 model은 DB를 장고 내부에서 사용하기 편하도록 연동시켜주는 것
개발하는 입장에서 DB의 내용을 자세히 알지 않아도 되게 해준다.
Model 만들기
models.py에 내용 입력
#accountapp/models.py from django.db import models # Create your models here. class HelloWorld(models.Model): #Model을 상속받아서 구현하고자 한다. text = models.CharField(max_length=255, null=False) #null이 true이면 내용이 없어도 된다는 것
터미널에 python manage.py makemigrations 입력하기
models.py를 DB와 연동할 python파일로 만들어주는 작업이다.
파일을 만들고 나서 자동으로 연동이 되지는 않기 때문에 터미널에 python manage.py migrate 를 입력한다.
[HTTP 프로토콜 GET, POST]
- protocol : 컴퓨터가 서로 통신을 하기 위해 사용하는 규약
- protocol에 다양한 method가 있지만 꼭 알아야 하는 두 가지가 GET과 POST이다.
- User가 요청(request)을 보낼 때 GET 또는 POST 방식으로 보낸다.
- GET과 POST는 서버에서 필요로 하는 정보를 넣어주는 방식이다.
GET
주로 조회를 하기 위해 많이 보낸다.
적은 양의 데이터를 보내기 때문에, 주소 안에 추가적인 파라미터를 넣어서 보낸다.
주소 안에 ? 뒤에 파라미터가 들어간다.
POST
- 주로 생성, 수정을 하기 위해 많이 보낸다.
- 주소 안에 정보를 넣는 것이 아니라, BODY라는 응답 몸통에 넣어 보낸다.
- 따로 html에 form(서버에 보내는 요청)에 설정한다.
POST 실습
HTML에 form을 생성해준다.
<!-- action에는 요청을 보내는 URL이 들어간다. --> <form action="/account/hello_world/" method="post"> {% csrf_token %} <div> <input type="submit" class="btn btn-primary" value="POST"> </div> </form>
장고에서 POST 메서드를 사용해 서버에 요청을 보낼 때는 항상 csrf_token을 항상 form안에 명시해주어야 한다.
accountapp/views.py에서 POST와 GET을 구분해보자.
#accountapp/views.py def hello_world(request): if request.method == "POST": return render(request,'accountapp/hello_world.html', context={'text': 'POST/METHOD!!!'}) else: //GET 방식 return render(request, 'accountapp/hello_world.html', context={'text': 'GET/METHOD!!!'})
context를 보면, text라는 이름의 POST METHOD!! 라는 내용을 같이 return해준다.
hello_world.html에서 유저의 요청을 처리한 결과를 출력해보자.
<form action = "/account/hello_world/" method = "post"> {% csrf_token %} <input type = "submit" class = "btn btn-primary" value = "POST"> </form> <h1> {{ text }} </h1>
[POST 통신을 이용한 DB 데이터 저장 실습]
form을 만들어 유저의 요청을 보낸다.
<form action = "/account/hello_world/" method = "post"> {% csrf_token %} <div> <input type = "text" name = "hello_world_input"> </div> <div> <input type = "submit" class = "btn btn-primary" value = "POST"> </div> </form>
- input을 구분하기 위해 name을 사용한다.
유저가 어떻게 보냈었는지 정보를 받아서 화면에 표시해보자
#accountapp/views.py def hello_world(request): if request.method == "POST": temp = request.POST.get('hello_world_input') return render(request,'accountapp/hello_world.html', context={'text': temp}) else: return render(request, 'accountapp/hello_world.html', context={'text': 'GET/METHOD!!!'})
유저가 보낸 data를 HelloWorld() 모델을 사용하여 DB에 저장해보자
#accountapp/views.py def hello_world(request): if request.method == "POST": temp = request.POST.get('hello_world_input') new_hello_world = HelloWorld() new_hello_world.text = temp new_hello_world.save() return render(request, 'accountapp/hello_world.html', context={'hello_world_output': new_hello_world}) else: hello_world_list = HelloWorld.objects.all() return render(request, 'accountapp/hello_world.html', context={'text': 'GET/METHOD!!!'})
DB에 저장한 data를 화면에 표시해보자 (hello_world.html파일)
{% if hello_world_output %} <h1> {{ hello_world_output.text }} </h1> {% endif %}
- hello_world_output이 존재한다면, hello_world_output.text를 출력해라
[DB 정보 접근 및 장고 템플릿 내 for loop]
DB에 저장되는 list를 모두 긁어오기
#accountapp/views.py def hello_world(request): if request.method == "POST": temp = request.POST.get('hello_world_input') new_hello_world = HelloWorld() new_hello_world.text = temp new_hello_world.save() #POST를 1번 완료한 후에는 GET으로 돌아가게 하자 #아래 코드의 뜻은 'accountapp 내부에 있는 hello_world로 재접속하라'라는 의미 return HttpResponseRedirect(reverse('accountapp:hello_world')) else: hello_world_list = HelloWorld.objects.all() #DB에 저장된 list 모두 긁어오기 return render(request, 'accountapp/hello_world.html', context={'hello_world_list': hello_world_list})
HttpResponseRedirect(경로) : 다시 재 연결된다.
reverse(경로) 이런 식으로 작성하기 위해서는, 초반에 accountapp/urls.py에 아래와 같이 저장되어 있어야 한다.(app_name, path안의 name)
reverse()는 (’accountapp:hello_world')에 해당하는 경로를 다시 만들어 주는 역할을 한다.
app_name="accountapp" urlpatterns = [ path("hello_world/", hello_world, name='hello_world'), ]
HTML에서 list를 보여주기
{% if hello_world_list %} {% for hello_world in hello_world_list %} <h4> {{ hello_world.text }} </h4> {% endfor %} {% endif %}
[출처] 작정하고 장고! Django Pinterest 따라만들기 : 바닥부터 배포까지
섹션 1. Django Tutorial (14강 ~ 18강)
'프로그래밍 강의 > Django' 카테고리의 다른 글
[Django Study 07] Login / Logout 구현 및 Bootstrap을 통한 디자인 (0) | 2022.04.19 |
---|---|
[Django Study 06] Django CRUD 및 CreateView (0) | 2022.04.18 |
[Django Study 04] Style and CSS (0) | 2022.04.13 |
[Django Study 03] Django Template - extends, include로 HTML 만들기 (0) | 2022.04.12 |
[Django Study 02] Django 시작 & Gitignore (0) | 2022.04.11 |