본문 바로가기
프로그래밍 언어

[Python] Django로 웹 페이지 만들기 (2)

by 다람이도토리 2021. 5. 15.

프로그래머스 인공지능과정 Week5 - Day2 내용

오늘은, 이제 Django에 어떻게 DB를 연동시킬지, 어떤 흐름으로 관리할수 있을지 확인해보자.

다시 보는, Django의 구조

우리는 페이지를 만들면서 template로 html을 만들고, 이를 view에서 어떤 페이지를 띄워줄지 처리하였다.
이제 이를 URL에서 주소를 지정하여 주었다.

그런데, DB는 어디에 들어가야 할까? DB는 이제 Model을 통해 지정하게 된다.

 

Model 설계

Model은 class 형태로, 어떤 db를 만들지 정의한다. 

from django.db import models

# Create your models here.
class Coffee(models.Model):
    ## 각 Attribute가 Columns가 된다.
    def __str__(self):
        return self.name

    name = models.CharField(default="", max_length=30)
    price = models.IntegerField(default=0)
    is_ice = models.BooleanField(default=False)
    """
    default를 기본적으로 잡자, null 정하지 않으면, 기본값 False
    문자 : CharField   max_length 필수
    숫자 : IntegerField
    논리형 : BooleanField
    시간/날짜 : DateTimeField
    """

 

View의 설계

맨 위의 그림을 보면, 이제 view로 와야 한다. 그리고 view에서 template, 즉 html을 띄워주기 위한 준비를 해야한다.

html에서 처리를 위해서는 view에서 request를 처리해줘야 한다.

from django.shortcuts import render
from .models import Coffee
# Create your views here.
def index(request):
    return render(request, 'index.html')
# 이후 migrate 작업을 진행해야 한다. 그래야 모델이 만들어진걸 알게 된다. 바로하지말고. migration 먼저 만들어.
# makemigrations -> migrate 순서로 진행


def coffee_view(request):
    # 모든 데이터를 가져오는 대신에 get이나 filter 같은 방법을 사용 가능하다.
    coffee_all = Coffee.objects.all()
    return render(request, 'coffee.html', {"coffee_list": coffee_all, "coffee_form": form})

 

Form의 설계, 다시 view로

그런데, html 화면에서 직접 CRUD를 수행하기 위해서는 무언가 입력할 도구가 필요하지 않을까? 그리고 template에서 다시 db를 갈라면 위의 그림에 따르면, 또 view에서 처리를 해야만 할것이다. 

여기서, 입력을 하는 틀을 만들어 주는 것이 바로 "Form"이다.

# template에서 model을 변동하는 방법
# DB를 받기 위한 양식
# Model과 입력받을 field 지정
from django import forms
from .models import Coffee


class CoffeeForm(forms.ModelForm):
    class Meta:
        # Model,Coffee 연동
        model = Coffee
        fields = ('name', 'price', 'is_ice')

 

Template을 만들고, Model, Form, Template를 View에서 만나게 하다.

근데, Template을 가기 전에, 우리는 View에서 Template에 쓸 변수를 먼저 만들어줘야한다. 

form 및 create 기능까지 반영된  View 결과는 다음과 같다.

from django.shortcuts import render
from .models import Coffee
from .forms import CoffeeForm
# Create your views here.
def index(request):
    return render(request, 'index.html')
# 이후 migrate 작업을 진행해야 한다. 그래야 모델이 만들어진걸 알게 된다. 바로하지말고. migration 먼저 만들어.
# makemigrations -> migrate


def coffee_view(request):
    # 모든 데이터를 가져오는 대신에 get이나 filter 같은 방법을 사용 가능하다.
    coffee_all = Coffee.objects.all()
    # If, request = Post,
    if request.method == "POST":
        form = CoffeeForm(request.POST)
        if form.is_valid():
            form.save()
    form = CoffeeForm() # 객체 생성, form 틀을 만듬, 서버로 전송하는 버튼은 어디?
    return render(request, 'coffee.html', {"coffee_list": coffee_all, "coffee_form": form})

 

이제 이를 template에 적용하면 준비 끝.

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Coffee_list</title>
    </head>
    <body>
        <h1> Coffee_list</h1>
        {% for coffee in coffee_list %}
            <p>{{ coffee.name }}, {{ coffee.price }}</p>
        {% endfor %}

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

 

이 패턴의 흐름을 이해하는 것이 가장 중요하다.