: 어떤 정보의 요청에 대해 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)
admin에 들어가 있던 Groups, Users는 django 프로젝트를 만들 때 같이 만들어주게 되는데 Coffee와 마찬가지로 클래스 단위로 만들어져있는데 migrate를 이용해 반영하게 된다.
#git add
python manage.py makemigrations homepage
#gitcommit
python manage.py migrate
-> 모델이 잘 반영되었다.
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)
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
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에 저장 할 수 있다.