본문 바로가기

Code-note

[Django] 장고 공식 튜토리얼 -python

웹 풀 프레임워크 - Django  tutorial
공식 튜토리얼 차근차근 따라가며 진행해보기! 

 

https://docs.djangoproject.com/en/5.1/intro/tutorial01/

 

Writing your first Django app, part 1 | Django documentation

The web framework for perfectionists with deadlines.

docs.djangoproject.com

---------------------------------------------------------------------

[0. 가상환경 및 라이브러리 설치]

$ cd <my directory> 
$ python -m venv .venv
$ pip install Django
$ source .venv/bin/activate
$ pip list

---------------------------------------------------------------------

[1. Django 기본 파일 구조 만들기]

$ django-admin startproject mysite
$ cd mysite
$ python manage.py startapp polls
$ python manage.py migrate
$ python manage.py runserver

---------------------------------------------------------------------

[2. 앱의 urls / views를 설정]

from django.http import HttpResponse

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

# mysite/polls/views.py

=> urls(/polls/) 의 주소에 접속 하였을 때 실행할 함수(index)를 정의 ; 보통 시각적으로 보여 줄 것들

from django.urls import path
from . import views

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

# mysite/polls/urls.py

=> urlpatterns로 URL *라우팅* 시스템을 정의

* 특정한 URL 패턴을 정의하고, 이 패턴에 맞는 URL 요청이 들어오면 그에 맞는 뷰 함수나 뷰 클래스를 실행

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

urlpatterns = [
	path("polls/", include("polls.urls")),
	path("admin/", admin.site.urls),
]

# mysite/mysite/urls.py 

=> 최상위 경로에서 URL 라우팅 시스템 정의

=> include 함수를 사용하여 다른 형태의 urls 라우팅을 관리할 수 있음

---------------------------------------------------------------------

[3. Activating models / Migration]

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)

# mysite/polls/models.py 

=> ORM(Object-Relational Mapping)을 사용하여 데이터베이스 모델을 정의한 것

=> Django의 모델 클래스를 사용하여 설문 질문(Question)과 선택지(Choice)를 데이터베이스에 저장하기 위한 구조를 정의

INSTALLED_APPS = [
    "polls.apps.PollsConfig",
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

# mysite/mysite/settings.py 

=> "polls.apps.PollsConfig" 을 INSTALLED_APPS의 리스트 안에 추가 

=> Django 프로젝트에 polls 앱을 추가하기 위한 것

# polls 앱 내의 모델 변경 사항을 감지하고, 그에 따라 데이터베이스 스키마를 정의 / 검토
$ python manage.py makemigration polls 
$ python manage.py sqlmigrate polls 0001

# 데이터베이스에 해당 변경 사항을 반영하여 테이블을 생성하거나 수정
$ python manage.py migrate 

---------------------------------------------------------------------

[4. Playing with the API]

## 데이터 베이스와 상호작용하는 기본적인 방법
$ python manage.py shell
>>> from polls.models import Choice, Question
>>> Question.objects.all()
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())
>>> q.save()
>>> q.id
## q 객체의 question_text 필드를 확인 및 수정하는 방법
>>> q.question_text
>>> q.pub_date
>>> Question.objects.all()
>>> q.question_text = "What's up?"
>>> q.save()
>>>Question.objects.all()
<QuerySet [<Question: Question object (1)>]>
## Question.objects.all().delete() : Question 전부 지우기

=> <QuerySet [<Question: Question object (1)>]> 는 객체를 설명하는 데 충분하지 않음 ; 그래서 models.py를 편집

=> Django shell의 편집은 필수적인 것은 아니지만, 데이터 베이스와의 상호작용은 확인하기 위해 필요함. 

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

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

# mysite/polls/models.py 

=> Question, Choice 클래스에 __str__ 함수를 추가해주고, Question에 time zone 기능을 넣어줌

=> __str__ : 객체의 메모리 주소 대신 문자열이 출력됨. ex) Question_text 출력 

---------------------------------------------------------------------

[5. Introducing the Django Admin 관리자 계정 설정]

$ python manage.py createsuperuser
#Username: admin
#Email address: admin@example.com
#Password: **********
#Password (again): *********
#Superuser created successfully.
$ python manage.py runserver

=> 관리자 계정 만들기  : admin site(/admin/)에서 login 가능

from django.contrib import admin
from .models import Question

admin.site.register(Question)

# mysite/polls/admin.py 

=> admin site에서 Question을 수정하고 등록할 수 있도록 함. 

---------------------------------------------------------------------

[6. Writing more views 페이지 뷰 설정]

from django.http import HttpResponse

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

def detail(request, question_id):
    return HttpResponse("You're looking at question %s." % question_id)
def results(request, question_id):
    response = "You're looking at the results of question %s."
    return HttpResponse(response % question_id)
def vote(request, question_id):
    return HttpResponse("You're voting on question %s." % question_id)

# mysite/polls/views.py

from django.urls import path
from . import views

urlpatterns = [
    path("", views.index, name="index"),# ex: /polls/
    path("<int:question_id>/", views.detail, name="detail"),# ex: /polls/5/
    path("<int:question_id>/results/", views.results, name="results"),# ex: /polls/5/results/
    path("<int:question_id>/vote/", views.vote, name="vote"),# ex: /polls/5/vote/
]

# mysite/polls/urls.py