컴굥일지

[Django Study 05] Model, DB 연동, HTTP 프로토콜(GET, POST), DB 데이터 저장 본문

프로그래밍 강의/Django

[Django Study 05] Model, DB 연동, HTTP 프로토콜(GET, POST), DB 데이터 저장

gyong 2022. 4. 14. 00:05
반응형

[Model, DB 연동 - makemigrations, migrate]

  • model : 장고에서 model은 DB를 장고 내부에서 사용하기 편하도록 연동시켜주는 것

    개발하는 입장에서 DB의 내용을 자세히 알지 않아도 되게 해준다.

Model 만들기

  1. 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이면 내용이 없어도 된다는 것
  2. 터미널에 python manage.py makemigrations 입력하기

    models.py를 DB와 연동할 python파일로 만들어주는 작업이다.

  3. 파일을 만들고 나서 자동으로 연동이 되지는 않기 때문에 터미널에 python manage.py migrate 를 입력한다.



[HTTP 프로토콜 GET, POST]

  • protocol : 컴퓨터가 서로 통신을 하기 위해 사용하는 규약
  • protocol에 다양한 method가 있지만 꼭 알아야 하는 두 가지가 GET과 POST이다.
  • User가 요청(request)을 보낼 때 GET 또는 POST 방식으로 보낸다.
  • GET과 POST는 서버에서 필요로 하는 정보를 넣어주는 방식이다.

GET

  • 주로 조회를 하기 위해 많이 보낸다.

  • 적은 양의 데이터를 보내기 때문에, 주소 안에 추가적인 파라미터를 넣어서 보낸다.

    주소 안에 ? 뒤에 파라미터가 들어간다.

POST

  • 주로 생성, 수정을 하기 위해 많이 보낸다.
  • 주소 안에 정보를 넣는 것이 아니라, BODY라는 응답 몸통에 넣어 보낸다.
  • 따로 html에 form(서버에 보내는 요청)에 설정한다.

POST 실습

  1. 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안에 명시해주어야 한다.

  2. 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해준다.

  3. 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 데이터 저장 실습]

  1. 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을 사용한다.
  2. 유저가 어떻게 보냈었는지 정보를 받아서 화면에 표시해보자

     #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!!!'})
  1. 유저가 보낸 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!!!'})
  1. 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]

  1. 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'),
        ]
  1. 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강)

https://www.inflearn.com/course/%EC%9E%A5%EA%B3%A0-%ED%95%80%ED%84%B0%EB%A0%88%EC%8A%A4%ED%8A%B8/dashboard

반응형
Comments