ETC

Django 설문조사 앱 만들기 1

Yejin 2022. 1. 19. 00:36

0. 설치

 

$python -m pip install Django

 

1. 프로젝트 만들기

 

: 하나의 앱을 만들기 위한 폴더를 만든다고 생각하면 쉽다!

$django-admin startproject mysite

 

2. 서버 작동

 

$python manage.py runserver

 

직접 서버를 run하기 위해 명령어를 입력해주었는데, 저같은 경우 manage.py의 SyntaxError가 발생했습니다.

 

 

아래 명령어로 실행해주니 해결이 되었습니다.

//python(자신의버전) manage.py runserver
$python3.9 manage.py runserver

 

명령어를 입력해주면 http://~~ 주소를 복사해줍니다.

 

그 후 구글에 입력하여 아래와 같은 화면이 뜨면 성공!!

 

 

3. 설문조사 앱 생성

 

: 만들고자하는 앱의 폴더명을 입력 (ex. polls)

$python3.9  manage.py startapp polls

 

4. 첫 번째 뷰 작성하기

 

: polls/view.py 를 열어 다음과 같은 파이썬 코드를 입력

from django.http import HttpResponse

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

 

mysite.urls

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.urls')), # polls/ 형태의 request는 polls.urls로 보내라 라는 뜻 ->  polls 폴더안의 urls.py
    path('admin/', admin.site.urls),
]

 

polls.urls

from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'), #polls/뒤에 빈 값이 오면 views.index함수를 호출해서 response로 줘라
]

 

 

( 결과 )

 

5. 데이터 베이스 설치

 

$python3.9 manage.py migrate

 

6. 모델 만들기

 

: polls/models.py에 작성

from django.db import models


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


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

 

7. 모델의 활성화

 

: mysite/settings.py에 작성

INSTALLED_APPS = [
    'polls.apps.PollsConfig', #추가되는 부분
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

 

makemigrations 을 실행시킴으로서, 당신이 모델을 변경시킨 사실과(이 경우에는 새로운 모델을 만들었습니다) 이 변경사항을 migration으로 저장시키고 싶다는 것을 Django에게 알려줍니다. Migration은 Django가 모델(즉, 당신의 데이터베이스 스키마)의 변경사항을 디스크에 저장하는 방법입니다. 원하는 경우 polls/migrations/0001_initial.py 파일로 저장된 새 모델에 대한 migration을 읽어볼 수 있습니다. 걱정하지 마세요, 여러분이 Django가 migration을 만들 때마다 읽을 것으로 기대되지는 않지만, Django의 변경점을 수동으로 수정하기를 원할 때를 대비해서 사람이 수정할 수 있도록 설계되었습니다.당신을 위해 migration들을 실행시켜주고, 자동으로 데이터베이스 스키마를 관리해주는 migrate 명령어가 있습니다. 이 명령을 알아보기 전에 migration이 내부적으로 어떤 SQL 문장을 실행하는지 살펴봅시다. sqlmigrate 명령은 migration 이름을 인수로 받아, 실행하는 SQL 문장을 보여줍니다.

 

$python3.9 manage.py makemigrations polls

 

 

dbsqlite3 DB안에 polls.models에서 정의한 형식대로 DB가 구성됨

이제, migrate 를 실행시켜 데이터베이스에 모델과 관련된 테이블을 생성해봅시다.

$python3.9 manage.py migrate

 

8. API 가지고 놀기

 

$python3.9 manage.py shell

 

>>> from polls.models import Choice, Question #polls.models.Question 임포트
>>> Question.objects.all() #Question 테이블의 오브젝트 보기 -> 현재는 아무런 데이터 존재x
>>> from django.utils import timezone 

#Question 함수 내에 txt는 ~로, date는 지금으로 설정하겠다
>>> q = Question(question_text="What's new?", pub_date=timezone.now()) 
>>> q.save() #저장

 

다시 Question.objects.all()을 수행해보면, Qeustion 오브젝트가 1개 생긴 것을 볼 수 있음

하지만 Question object가 1인 것은 나오지만 자세한 정보가 나오지 않고 있음 -> 가독성을 높이자!

 

polls.models.py 에 def함수 __str__ 추가 -> 모델에 __str__() 메소드를 추가하는것은 객체의 표현을 대화식 프롬프트에서 편하게 보려는 이유 말고도, Django 가 자동으로 생성하는 관리 사이트 에서도 객체의 표현이 사용되기 때문

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    def __str__(self):
        return self.qeustion_text


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE) #quetion이 choice에 속한 개념이니, choice는 question의 외래키를 받음
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
    def __str__(self):
        return self.choice_text

 

 

 

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)

 

import datetime

from django.db import models
from django.utils import timezone


class Question(models.Model):
    # ...
    def was_published_recently(self): #하루만에 publish 되는가?
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
>>> Question.objects.get(pk=1) #primary key 값이 1인 것만 가져와라
<Question: hey>
>>> q=Question.objects.get(pk=1)
>>> q.was_published_recently()
True