Django

데이터 베이스

  • 단순히 데이터를 저장한느 창고의 개념이 아닌, 데이터를 사용하기 쉽게 정렬해두어서 유저가 정보를
    참조하고 싶을 때 쉽게 바로 사용할 수 있게 해주는 시스템
  • 대표적으로 RDB(관계형 데이터베이스)가 이씅ㅁ
  • SQL을 사용하여 데이터베이스 관리

장고에서는 SQL을 사용하지 않고 데이터베이스와 상호작용할 수 있는 기법이 존재

 

 

ORM

객체 관계 매핑(Object-relational mapping; ORM)은 데이터베이스와 객체 지향 프로그래밍 언어 간의
호환되지 않는 데이터를 변환하는 프로그래밍 기법

\(\Rightarrow\) 장고에는 ORM이 내장되어 있음

 

 

 


Model

 

  • homepage/models.py
    • class <class name>(models.Model):
from django.db import models
class Coffee(models.Model):
    # Field 1
        # Field 2
    # ...
  • 클래스명은 데이터베이스 테이블명이다.
  • 각 필드(속성)는 데이터베이스 테이블의 컬럼이다.

 

models의 필드 타입

  • 문자열 : CharField
  • 숫자 : IntegerField, SmallIntegerField
  • 논리형 : BooleanField
  • 시간/날짜 : DataTimeField
  • ...

\(\Rightarrow\) 각 필드에 옵션을 인자로 주어 기본사항이나 제약사항을 추가할 수 있음

 

 

 

  • models.py
from django.db import models
class Coffee(models.Model):
    name = models.CharField(default="", max_length=30)
    price = models.IntegerField(default=0)
    is_ice = models.BooleanField(default=False)

 

 

 


Admin 페이지에서 Model 관리하기

 

  • homepage/admin.py
    • 장고가 기본적으로 제공하는 관리자 App
    • (이전 내용에서) superuser 계정을 이용하여 접근할 수 있었음
from django.contrib import admin
from .models import Coffee
admin.site.register(Coffee)

\(\Rightarrow\) admin 페이지에서 model들을 관리할 수 있음

 

 

 

admin 페이지 접속전에 마이그레이션 진행

# 변경사항 확인
python manage.py makemigrations

# 변경사항 적용
python manage.py migrate

 

 

 

 

 

 


+) coffee Object로 표시되어 보기 불편 -> 개선

admin의 객체의 표시 내용은 models.py에서 str 메소드로 지정 가능

 

  • models.py
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)

 

 

 

 

 


Template 상에서 Model 보여주기

  • views.py
...

def coffee_view(request):
    coffee_all = Coffee.objects.all()  # get(), fileter(), ...
    return render(request, 'coffee.html', {'coffee_list': coffee_all})

 

 

  • urls.py
urlpatterns = [
    ...
    path('coffee/', coffee_view),  # 127.0.0.1/coffee
]

 

 

  • coffee.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <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>

 

 

 

 

 

 


Template 상에서 Model 내용 변경하기 - Form 이용

  • forms.py
class <class_name>(forms.ModelForm):

from django.db import models

class CoffeeForm(forms.Model.Form): # ModelForm을 상속받는 CoffeeForm 생성
    # form을 만들기 위해 어떤 클래스를 사용하는지 지정해주는 class meta
    class Meta:
        model = Coffee
        fields = ('name', 'price', 'is_ice')

 

  • Meta class
    • model : 모델명
    • fields : 가져올 필드를 지정

 

 

  • views.py
from .forms import CoffeeForm

def coffee_view(request):
    coffee_all = Coffee.objects.all()  # get(), fileter(), ...
    form = CoffeeForm()
    return render(request, 'coffee.html', {'coffee_list': coffee_all, 'coffee_form': form})

 

 

  • coffee.html
...
<body>
    ...
    <form method="POST">{% csrf_token %}
        {{ coffee_form.as_p }}

        <button type="submit">Save</button>
    </form>
...

form 안에는 반드시 CSRF token을 추가해주어야 함!

 

 

 

 


DB에 저장하는 코드

  • views.py
def coffee_view(request):
    coffee_all = Coffee.objects.all()  # get(), fileter(), ...

    # 만약 request가 POST라면:
    # POST를 바탕으로 Form을 완성하고
    # Form이 유효하면 -> 저장!
    if request.method == "POST":
        form = CoffeeForm(request.POST)     # 내용이 채워진 완성된 Form
        if form.is_valid():                 # 채워진 Form이 유효하다면:
            form.save()                     # Form 내용을 Model에 저장

    form = CoffeeForm()
    return render(request, 'coffee.html', {'coffee_list': coffee_all, 'coffee_form': form})