Web/Django

[AI Class Day 19]Django 2 - Model TIL

makeitworth 2021. 5. 18. 15:08

지난 시간 정리

 

우리가 만든 simple django project는 이렇게 구성되어 있다.

webproj 내에 쟝고 서버 실행을 담당하는 manage.py 파일과  webproj 폴더, homepage 폴더

 

webproj 폴더 내에 전체 프로젝트의 세팅과 url 경로 등을 관리하는 파일들

 

프로젝트 내에 만든 app homepage를 관리할 수 있는 homepage 폴더 내의 파일들

그리고 지난 시간에 MTV 구조에서 T와 V, template 과 view를 활용하는 것을 공부했고, 이번 시간은 model을 더하는 시간

 

 

 

데이터 베이스 

  • 데이터를 저장하는 시스템
  • 단순히 데이터를 저장하는 것이 아니라, 데이터를 사용하기 쉽게 정렬해 두어 유저가 정보를 참조하고 싶을 때, 쉽게, 바로 사용할 수 있게 해주는 시스템
  • 대표적으로 RDB(관계형 데이터 베이스)가 있음 ( pandas dataframe 과 유사, row와 column으로 데이터 구성)
  • SQL : 관계형 데이터베이스 작업을 하기 위한 언어
  • django에서는 sql을 사용하지 않고, ORM을 통하여 db와 상호작용
  • orm : 객체 관계 매핑 (object-relational mapping) 데이터 베이스와 객체 지향 프로그래밍 언어 간의 호환되지 않는 데이터를 변환하는 프로그래밍 기법
  • django에는 orm이 내장되어 있음 -> models.py 에서 작업

MODEL

  • class : db table
  • field : db table column 
  •  
  • models.py의 fileldtype 종류
    • 문자열
    • 숫자
    • 논리형
    • 시간/날짜
  • 각 field에 옵션을 인자로 주어 기본사항이나 제약사항을 추가할 수 있음
  • 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)

그 외의 옵션 인자

null : null을 허용하는지. null = False 라면, 반드시 값이 채워져야 한다. default 값이 False

Admin 페이지에서 db 관리하기

 

admin.py

  • 장고가 기본적으로 제공하는 관리자 app
  • superuser 계정으로 접근 가능

 

이렇게 models.py 에서 만들어 놓은 Coffee 모델을 불러서 등록

+ CLI에서 migration 진행

(데이터베이스에 대한 변동 사항이 생기면 migration 단위로 관리한다. DB field 정보를 수정한 후에도 migration을 진행해야 수정 사항이 반영됨)

python manage.py makemigrations
python manage.py migrate

 

이후 <주소>/admin 에 접속하면, db 제어 가능

 

목록에 Coffee object라고만 떠서 불편함 ->

models.py 에서 __str__ 함수 정의해서 print 될 것 지정 가능

 

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

 

admin 페이지 말고 Template 상에서 Model 보여주기

 

그림을 보듯이 View를 거쳐야 한다.

 

views.py 에 coffee model에서 불러온 함수 추가

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

 

urls.py

 

urlpatterns 에 url path 추가

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 상에서 POST 기능 구현하기 -Form 활용

 

forms.py

  • class <class_name>(forms.ModelForm):
  • class meta
    • model: 사용할 모델명 지정
    • fields : 가져올 필드 지정
from django.db import models
from django import forms
from .models import Coffee

class CoffeeForm(forms.Model.Form): # ModelForm을 상속받는 CoffeeForm
    class Meta:
        model = Coffee
        fields = ('name', 'price', 'is_ice')

 

 

views.py

 

입력 요청이 들어오면, db에 저장

+

커피 폼 객체 생성

from .forms import CoffeeForm

def coffee_view(request):
    coffee_all = Coffee.objects.all()
    
    # request를 받아서 db에 저장하는 코드
    # 만약 request가 POST라면:
    # POST를 바탕으로 Form을 완성하고
    # Form이 유효하면 -> Model에 저장
    if request.method == "POST":
        form = CoffeeForm(request.POST)    
        if form.is_valid():                 
            form.save()                   
    
    form = CoffeeForm()
    return render(request, 'coffee.html', {'coffee_list': coffee_all, 'coffee_form': form})

 

coffee.html

 

body tag 안에 입력란과 submit 버튼 추가 

반드시 csrf_token 추가 해줘야 함 (보안 옵션)

    <form method="POST">{% csrf_token %}
        {{ coffee_form.as_p }} #as paragraph 정확하게 form의 형태로 나타냄

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

'Web > Django' 카테고리의 다른 글

[AI Class Day 18] Django - basic and Templates TIL  (0) 2021.05.18