[프로그래머스 인공지능 미니 데브코스] 수업 정리 -4- [Django으로 동적 웹 페이지 만들기]

3yeong·2022년 7월 26일
0

4. Model

: 어떤 정보의 요청에 대해 DB를 관리하는 곳이다. Template과 View에 정보를 제공한다.

: 데이터베이스는 정보를 정렬(구조화)하여 user가 쉽게 참조 할 수 있는 시스템이다. RDB(Relational DB)는 테이블(row, column) 형태로 보관한다. pandas의 DataFrame와 유사하다. SQL은 DB에서 정보를 가져오는데 사용하는 인터페이스이다. django는 SQL을 사용하지 않고(사용할 수도 있다) 내장되어 있는 ORM object(객체)을 사용해서 DB를 다룰 수 있다.

#models.py
class Coffee(models.Model):
    '''
    field1 = models.FieldType()... 
    #한 행이 가지는 column들의 type을 지정해준다.
    문자열 : CharField
    숫자 : IntegerField, SmallIntegerField
    논리형 : BooleanField
    시간/날짜 : DateTimeField
    '''
    name = models.CharField(default=" ", max_length=30) #옵션을 넣어줌
    price = models.IntegerField(default=0)
    is_ice = models.BooleanField(default=False)
    

#admin.py
from django.contrib import admin
from .models import Coffee

#models.py 불러오기
admin.site.register(Coffee)

migration

admin에 들어가 있던 Groups, Users는 django 프로젝트를 만들 때 같이 만들어주게 되는데 Coffee와 마찬가지로 클래스 단위로 만들어져있는데 migrate를 이용해 반영하게 된다.

#git add 
python manage.py makemigrations homepage
#gitcommit
python manage.py migrate

-> 모델이 잘 반영되었다.




object의 이름을 수정

class Coffee(models.Model):
    def __str__(self):
        return self.name
    name = models.CharField(default=" ", max_length=30)
    price = models.IntegerField(default=0)
    is_ice = models.BooleanField(default=False)

5. Template에서 Model 확인하기

view를 통하여 model과 template가 연결되는 방식이다.

#views.py
from .models import Coffee
def coffee_view(reqeust):
    #데이터의 정보를 전부 가져온다.
    coffee_all = Coffee.objects.all()
    return render(reqeust,'coffee.html', {"coffee_list" : coffee_all})
#coffee.html (template에 새로 생성)
<!DOCTYPE html>
<html>
  <head>
      <title>Coffee List</title>
  </head>
  <body>
    <h1>My Coffee List</h1>
    <p>{{ coffee_list }}</p>
  </body>
</html>
#urls.py (위치 추가)
from homepage.views import index, coffee_view
urlpatterns = [
    path('', index), #127.0.0.1/
    path('coffee/', coffee_view),#127.0.0.1/coffee/
    path('admin/', admin.site.urls), #127.0.0.1/admin/
]

<!coffee.html>
<!DOCTYPE html>
<html>
  <head>
      <title>Coffee List</title>
  </head>
  <body>
    <h1>My Coffee List</h1>
    {% for coffee in coffee_list %}
      <p>{{ coffee.name }} , {{ coffee.price }}</p>
    {%endfor%}
  </body>
</html>

기본적인 로직
model - view(model import) - template(변수, 태그) - url

6. Form으로 Template에서 Model 수정하기

homepage 안에 forms.py 생성

#forms. py
from django import forms #form import
from .models import Coffee #model 호출

class CoffeeForm(forms.ModelForm): #model Form을 상속받음
    class Meta: #form을 만들기 위해 어떤 model이 소요되는지 나타내는 것.
        model = Coffee
        field = ('name', 'price', 'is_ice')
def coffee_view(request):
    coffee_all = Coffee.objects.all() #.get(), .filter(), ...
    form = CoffeeForm() # Form의 객체를 만들어 준다.
    return render(request, 'coffee.html',{"coffee_list":coffee_all, "coffee_form":form})
<!coffee.html>
<!DOCTYPE html>
</html>
    <head>
        <title>Coffee List</title>
    </head>

    <body>
        <h1>My Coffee List</h1>
        {% for coffee in coffee_list %}
            <p>{{ coffee.name }} , {{ coffee.price }}</p>
        {% endfor %}

        <form>
            {{ coffee_form.as_p }}
        </form>
    </body>
</html>

form에 대한 정보를 server로 보낼 버튼 필요

<!coffee.html>
<form method="POST">
            {{ coffee_form.as_p }}
            <button type="submit">Save</button>
</form>

form 안에 CSRF 토큰을 삽입해야한다.

<!coffee.html>
        <form method="POST">{% csrf_token %}
            {{ coffee_form.as_p }}
            <button type="submit">Save</button>
        </form>

버튼을 눌렀을 때 오류는 나타나지 않지만 DB에 들어가지 않아 나타나지 않는다. view에서 post 처리하는 정보가 있지 않기 때문이다.

views.py
def coffee_view(request):
    coffee_all = Coffee.objects.all() #.get(), .filter(), ...
    # 만약 request가 POST라면:
        # POST 바탕으로 Form을 완성하고
        #Form이 유효하면 -> 저장!
    if request.method == "POST":
        form = CoffeeForm(request.POST) #파일 상에서 post로 보내준 내용을 바탕으로 form을 완성
        if form.is_valid(): #채워진 form이 유효한지 체크
            form.save() #이 Form 내용을 Model에 저장

    form = CoffeeForm() # Form의 객체를 만들어 준다.
    return render(request, 'coffee.html',{"coffee_list":coffee_all, "coffee_form":form})

form은 DB를 입력받기 위한 양식이다.
어떤 모델을 어떤 field를 통해 입력 받을 것인지 view에서 template에 전달하여 form을 사용하면 admin을 거치지 않고 DB에 저장 할 수 있다.

profile
초보 컴공

0개의 댓글