본문 바로가기

TIL/Python

[Python] Django 튜토리얼

Django

Flask와 같은 웹 프레임워크의 일종이다. 

 

Django의 구조

Django는 Model - Template - View 패턴을 사용한다.

MTV 패턴이란?

 

Django는 여러개의 app을 활용하여 하나의 웹을 만들게 된다. app을 하나의 작은 페이지 단위라고 생각하면 이해하기 편하다.

 

전체적으로 관리해야 할 것

URL : 각 페이지의 역할을 정의한다. URL별로 어떤 template을 띄워줄 것인지 결정하게 된다.
Settings : 사용가능한 app의 목록, 템플릿 등을 지정한다.

 

app별로 관리해야 할 것

Template : 각 페이지의 기본 모습을 관리한다. (html을 활용하여 작성하게 된다.)
View : request에 대한 처리 필요, 데이터베이스를 여기서 관리한다.
Model : DB에 저장되는 데이터를 의미. 모델은 클래스로 정의되며 하나의 클래스가 하나의 DB Table이다.

 

 

Django를 통한 간단한 설계

 

1. app을 생성한다.  (diango-admin startapp <app_name>)

2. 해당 app에서 template 폴더를 생성한 후, html 문서를 만든다.

3. 해당 html문서에서 사용할 변수는 모두 해당 app의 view에서 정의한다.

from django.shortcuts import HttpResponse, render

# Create your views here.
# request에 대한 처리가 필요


def index(request):
    number = 10
    name = "Michael"
    nums = [1, 2, 3, 4, 5]
    return render(request, 'index.html', {"my_num": number, "my_name": name, "my_list": nums})

 

 

4. html 문서가 완성되었으면, 메인부분의 url에서 url 링크를 지정한다.

from django.contrib import admin
from django.urls import path
from homepage.views import index

urlpatterns = [
    # view에 대한 정보 추가.
    path('', index), # 127.0.0.1/
    path('admin/', admin.site.urls), # 127.0.0.1/admin/
]

 

 

5. settings에서, installed_app 부분에 app 이름 추가, template에서 DIRS를 추가한다.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'homepage'  # 장고 프로젝트에 설치된 앱 목록 추가 필요
]
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            # 해당 부분에 template 접근 권한을 부여해야 한다.
            os.path.join(BASE_DIR, "homepage", "template")
            ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

 

6. 실행 및 테스트는 python manage.py runserver를 입력하여 실시

 

 

 

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

 

지금부터 Model을 설계하면서 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에서 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을 가기 전에, 우리는 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>

 

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