이제 본격적으로 장고에 대해서 공부를 해보고자 한다. 장고의 공식문서를 바탕으로 하나씩 따라하면서 장고에 익숙해지는 시간을 가져보도록 하겠다.
장고 공식 문서: https://docs.djangoproject.com/ko/5.1/intro/tutorial01/
django-admin startproject 이름
공식문서에 따라 디렉토리 이름은 mysite로 하겠다.

mysite디렉토리에 연결하고 명령어를 입력한다.
python3 manage.py runserver
You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
September 07, 2024 - 10:28:56
Django version 4.2.16, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
다음과 같은 메세지가 출력된다면 성공 이제 우리는 로컬 서버를 열었다!
앱을 생성하기 위해 manage.py가 존재하는 디렉토리에서 다음의 명령을 입력한다.
python3 manage.py startapp polls(이름)
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
이러한 형태의 디렉토리 구조를 만들고 시작을 하겠다.
"polls/views.py"를 열어 코드를 작성한다.
from django.http import HttpResponse
def index(requre):
return HttpResponse("Hello World")
이것은 django의 가장 기본적인 view다.
이렇게 만들어진 뷰를 브라우저에서 엑세스 하기 위해서는 당연히 맵핑을 해야하고 이를 위해 URL Configuration 즉 "URLconf"를 정의해야 한다.
추가 정보) return시 ,(쉼표) 입력시 파이썬은 튜플로 인식하게 된다.
"polls/urls.py" 를 생성해준다.
from django.urls import path
from . import views
urlpatterns = [
path("",views.index,name="index"),
]
"mysite/urls.py" 부분은 아래와 같이 작성한다.
from django.contrib import admin
from django.urls import include,path
urlpatterns = [
path("polls/", include("polls.urls")),
path("admin/",admin.site.urls),
]
include() 함수는 다른 URLconf들을 참조할 수 있도록 도와준다.Django가 include()를 만나게 되면, URL의 그 시점까지 일치하는 부분을 잘라내고, 남은 문자열 부분을 후속 처리를 위해 include된 URLconf로 전달한다.
polls 앱에 그 자체의 URLconf(polls/urls.py)가 존재하는 한 그 어떤 다른 root 경로에 연결하더라도 앱은 잘 작동할 것이다.
💡) 다른 URL 패턴을 포함할 때마다 include()를 사용해야 한다! admin.site.urls가 유일한 예외다.
python3 manage.py runserver 입력시 잘 작동하는 모습을 볼 수 있다.
path()의 인수 - route
: route 는 URL 패턴을 가진 문자열 입니다. 요청이 처리될 때, Django 는 urlpatterns 의 첫 번째 패턴부터 시작하여, 일치하는 패턴을 찾을 때 까지 요청된 URL 을 각 패턴과 리스트의 순서대로 비교합니다.
패턴들은 GET 이나 POST 의 매개 변수들, 혹은 도메인 이름을 검색하지 않습니다. 예를 들어, https://www.example.com/myapp/ 이 요청된 경우, URLconf 는 오직 myapp/ 부분만 바라 봅니다. https://www.example.com/myapp/?page=3, 같은 요청에도, URLconf 는 역시 myapp/ 부분만 신경씁니다.
path() 의 인수 - view
: Django 에서 일치하는 패턴을 찾으면, HttpRequest 객체를 첫번째 인수로 하고, 경로로 부터 ‘캡처된’ 값을 키워드 인수로하여 특정한 view 함수를 호출합니다.
path() 의 인수 - name
:URL 에 이름을 지으면, 템플릿을 포함한 Django 어디에서나 명확하게 참조할 수 있습니다. 이 강력한 기능을 이용하여, 단 하나의 파일만 수정해도 project 내의 모든 URL 패턴을 바꿀 수 있도록 도와줍니다.
python3 manage.py migrate
명령어를 통해 데이터베이스 테이블을 생성하도록 한다. Django의 데이터베이스로 SQLite를 기본으로 사용된다.
이제는 모델을 만들어야 한다.
"polls/models.py"로 이동해 코드를 작성한다.
import datetime
from django.db import models
from django.utils import timezone
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_data = models.DateTimeField("date published")
def __str__(self):
return self.question_text
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
CharField 는 문자(character) 필드를 표현하고, DateTimeField 는 날짜와 시간(datetime) 필드를 표현한다.
CharField 의 경우 max_length 를 입력해 주어야 한다. 이것은 데이터베이스 스키마에서만 필요한것이 아닌 값을 검증할때도 쓰인다.
"mysite/setting.py" 에서
INSTALLED_APPS = [
"polls.apps.PollsConfig", -> 추가됨
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
]
을 설정에 추가해 줘야 한다. 이제 장고는 Polls앱이 추가된 것을 알게 되었다.
모델을 정의한 후 데이터베이스와 동기화 작업을 해야한다.
python manage.py makemigrations - 변경사항 저장
python manage.py migrate - 실행
동기화가 완료되었으면 shell을 통해 API를 조작할 수 있다.
python3 manage.py shell
from polls.models import Choice, Question # Import the model classes we just wrote.
# No questions are in the system yet.
>>> Question.objects.all()
<QuerySet []>
# Create a new Question.
# Support for time zones is enabled in the default settings file, so
# Django expects a datetime with tzinfo for pub_date. Use timezone.now()
# instead of datetime.datetime.now() and it will do the right thing.
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())
# Save the object into the database. You have to call save() explicitly.
>>> q.save()
# Now it has an ID.
>>> q.id
1
# Access model field values via Python attributes.
>>> q.question_text
"What's new?"
>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=datetime.timezone.utc)
# Change values by changing the attributes, then calling save().
>>> q.question_text = "What's up?"
>>> q.save()
# objects.all() displays all the questions in the database.
>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>
관리자를 생성하기 위한 명령어를 입력해준다.
python3 manage.py createsuperuser
아이디와 비번을 입력하면 관리자 계정이 생성된 것이다.
manage.py을 실행시키고 도메인을 /admin/ 으로 이동하면
와 같은 모습을 볼 수 있다. 관리자 계정으로 로그인을 하면 데이터베이스 접근이 가능하게 된다.
"polls/admin.py"를 수정하여 원하는 모델의 관리 인터페이스를 알려준다.
from django.contrib import admin
from .models import Question
admin.site.register(Question)
이렇게 하면 원하는 데이터를 직접 관리할 수 있게 된것이다!!