모두야

처음 보는 Django 연습하기 [1단계] 본문

study

처음 보는 Django 연습하기 [1단계]

미미밍2 2021. 8. 18. 00:16
반응형

Django

웹사이트를 신속하게 개발하도록 도움을 주는 파이썬 웹 프레임워크이다.

 

1. 파이썬 설치하기

2. 데이터 베이스 연결하기 (작은 프로젝트는 대부분 PASS)

3. 장고 설치하기 

pip install django

 확인하기

python
>>import django

 

4. 프로젝트 만들기 

4-1. VScode 설치하기

4-2. 프로젝트 생성하기

 

0. 프로젝트명 생성

원하는 dir로 이동하고 아래 명령어 입력하기

django-admin startproject 프로젝트명

>해당 폴더에 [프로젝트명]의 폴더가 생성되며 장고 프레임워크 기반의 문서가 자동으로 생성된다.

0-1. 개발 서버 작동하기

명령어 실행 후 나타나는 주소가 개발 서버가 된다.

py manage.py runserver

 

1. 앱 만들기

특정 기능을 수행하는 앱 만들기

(아이스크림 주문앱, 배달앱, 가게이벤트앱 등)

py manage.py startapp 앱1이름

2. 뷰 설정하기

# view.py에 첫번째뷰 설정하기
from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

뷰 코드를 호출하기 위해 url.py 코드를 작성 후 view.py와 연결해주어야 한다.

# url.py
from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

최상위 URLconf에 방금 만든 url을 연결하여준다.

프로젝트 폴더 [example]에 urls.py 내부에 있다.

#프로젝트 폴더-urls.py
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.url')),  #include 함수를 통해 방금 만든 polls앱의 url.py를 연결한다.
    path('admin/', admin.site.urls),
]

 

최상위 URLconf에서 polls.url을 받아 연결한다.

polls 앱의 url을 들어가면 원래는 아무것도 없지만, view.index를 통해 view.py와 연결된다.

view.py의 index인 "Hello World"가 출력될 것이다.

 


3. 데이터베이스 만들기

각각의 앱 마다 하나 이상의 데이터베이스 테이블을 사용한다.

그러기 위해서, 데이터베이스 테이블을 미리 만들 필요가 있다.

py manage.py migrate

 

경로에 맞는 cmd 창에 명령어를 입력하게 되면 

왼쪽과 같은 출력이 나타난다.

정상적으로 데이터베이스가 생성이 되었다.

 

 

 

 

 

 

 

 

4. 모델 만들기

단순 설문조사(polls)앱을 만들기 위해, Question과 Choice라는 두개의 모델을 만들어야한다.

Question 에는 question(질문)과 publication date(발행일) 두 가지의 필드를 가진다.
Choice에는 choice(선택지)와 vote(표) 계산을 위한 두 가지의 필드를 가진다.
각 Choice 모델을 Question 모델과 연관된다.
# polls/models.py
from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200) #질문내용 - 문자형으로최대200자
    pub_date = models.DateTimeField('date published') #질문날짜 -시간형


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE) #선택된 질문 - 외래키(Question모델 참조하겠다)
    choice_text = models.CharField(max_length=200) #질문내용
    votes = models.IntegerField(default=0) #투표수

5. 모델 활성화

앱 별로 기능이 다르다. 앱 등록을 하거나 안하거나에 따라 명시가 되고 안됨을 나타난다. 자유롭다는 뜻이다.

프로젝트 폴더 중 settings.pyINSTALLED_APPS에 등록하면 된다.

등록 전 / 등록 후 polls.apps.PollsConfig

6. makemigration 작업

모델 작성을 완료 하였으니, migration이라는 장소에 이 모델들을 데이터베이스 내에 테이블을 생성할 수 있도록 설계도를 만드는 작업을 한다. 

py manage.py makemigrations polls

migrations 내에 0001_initial.py 파일이 생성되었다.

데이터 베이스 내의 테이블을 생성하기 위한 설계도가 생성된 것이다.

 

 

데이터 베이스 내의 실제 테이블을 생성하는 작업을 수행한다.

py manage.py migrate


7. API 가지고 놀아보기

데이터베이스 내의 테이블까지 생성을 했으니, API를 만들어보자.

 

API란 ?

개발자가 필요로 하는 데이터를 뽑아낼 수 있도록 만들어내는 함수

= 서버에서 알맞는 데이터베이스를 입력/뽑아낼 수 있도록 만들어내는 함수

# 터미널 내의 명령어 쉘로 이동
py manage.py shell

입력할 코드 해석

from polls.models import Choice, Question

>> 만들어진 polls의 models에는 Choice와 Question이 있다. Choice와 Question을 사용할 것이니 우선 추가 하겠다.

 

Question.objects.all()

>> 현재 Question 내의 모든 데이터를 불러와라

Question 내에 아무 내용이 없으므로 [ ] 비어있다.

 

Question 내의 빈 내용(새로운 질문 하나)을 생성해보자.

Question 내에는 질문내용(question_text)와 질문날짜(pub_date)가 있었다.

from django.utils import timezone #질문시간을 위한 모듈 넣기
q = Question(question_text="What's new?",pub_date=timezone.now()) #새로운 질문 생성
q.save() #저장

데이터 생성 확인해보기

새로 만든 데이터 q의 id는 자동으로 1이 된다.

 

 

Question의 내용이 1개로 변경되었다.

데이터가 여러개 있을 때, 이게 어떤 데이터인지 확인하기 어렵다. 

따라서 모델을 조금 수정해주자. str 메소드를 이용하여 문구를 확인할 수 있다.

# model.py에 str 추가
from django.db import models

class Question(models.Model):
    # ...
    def __str__(self):
        return self.question_text

class Choice(models.Model):
    # ...
    def __str__(self):
        return self.choice_text

완성본

import datetime
from django.db import models
from django.utils import timezone
# Create your models here.


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def __str__(self):
        return self.question_text

    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

    def __str__(self):
        return self.choice_text

>> 현재시각 - 어제시간 = 어제 이후에 발행 된 질문(pub_date) 이 return


저장 후 처음부터 다시 살펴보자.

이제는 1개라고 표시 되는것이 아니라, 어떤 질문인지 나타난다.

반응형