Django 설문조사 앱 만들기 1

    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

    댓글