데이터베이스
장고에서는 SQL을 사용하지 않고 데이터베이스와 상호작용할 수 있는 기법이 존재
👇
ORM
객체 관계 매핑 (Object-relational mapping; ORM)은 데이터베이스와 객체 지향 프로그래밍 언어 간의 호환되지 않는 데이터를 변환하는 프로그래밍 기법
👉 장고에는 ORM이 내장되어 있음
models.py
class <class_name>(models.Model):
from django.db import models
class Coffee(models.Model):
# Field 1
# Field 2
# ...
클래스명은 데이터베이스 테이블명이다.
각 필드(속성)는 데이터베이스 테이블의 컬럼이다.
**models
의 필드 타입**
👉 각 필드에 옵션을 인자로 주어 기본사항이나 제약사항을 추가할 수 있음
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.py
장고가 기본적으로 제공하는 관리자 App
(이전 내용에서) superuser 계정을 이용하여 접근할 수 있었음
from django.contrib import admin
from .models import Coffee
admin.site.register(Coffee)
👉 admin 페이지에서 model들을 관리할 수 있음
admin 페이지 접속전에 마이그레이션 진행!
# 변경사항 확인
python manage.py makemigrations
# 변경사항 적용
python manage.py migrate
Coffee object로 표시되어 보기 불편함
→ admin의 각 객체의 표시 내용은 models.py
에서 str 메소드로 지정 가능
models.py
class Coffee(models.Model):
name = models.CharField(default="", max_length=30)
price = models.IntegerField(default=0)
is_ice = models.BooleanField(default=False)
def __str__(self):
return self.name
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>
forms.py
class <class_name>(forms.ModelForm):
from django.db import models
class CoffeeForm(forms.Model.Form):
class Meta:
model = Coffee
fields = ('name', 'price', 'is_ice')
Meta class
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})