첫 번째 장고 앱 작성하기, part 2
이번에는 데이터베이스를 설치하고 첫 모델을 생성한 후, Django에서 자동으로 생성되는 관리자 사이트에 대해 공부함.
데이터베이스 설치¶
이제, mysite/settings.py 파일을 열어보면된다.
이 파일은 Django 설정을 모듈 변수로 표현한 보통의 Python 모듈입니다.
기본적으로 데이터베이스 구성은 SQLite를 사용하는데,
데이터베이스를 처음 접하는 경우나 장고를 사용하는 것에 관심이 있는 경우 가장 쉽게 사용할 수 있습니다.
SQLite는 Python에 포함되어 있으므로 데이터베이스를 지원하기 위해 다른 것을 설치할 필요가 없지만.
첫 번째 실제 프로젝트를 시작할 때는 데이터베이스 전환의 번거로움을 피하기 위해 PostgreSQL과 같이 확장성이 뛰어난 데이터베이스를 사용하는 것이 좋습니다.
다른 데이터베이스를 사용하려면 세부 정보를 참조하여 데이터베이스를 사용자 지정하고 실행해야한다.
https://docs.djangoproject.com/ko/5.1/topics/install/#database-installation
Django 설치하는 법 | Django 문서
The web framework for perfectionists with deadlines.
docs.djangoproject.com
mysite/settings.py를 편집할 때, 당신의 시간대에 맞춰 TIME_ZONE 값을 설정해야 한다.
또한, 이 파일의 윗쪽에 있는 INSTALLED_APPS 에 대해 언급하면, 현재 Django 인스턴스에서 활성화된 모든 Django 어플리케이션들의 이름이 담겨 있는데, 앱들은 다수의 프로젝트에서 사용될 수 있고, 다른 프로젝트에서 쉽게 사용될 수 있도록 패키징하여 배포할 수 있다.
기본적으로는, INSTALLED_APPS는 Django와 함께 딸려오는 다음의 앱들을 포함하며
- django.contrib.admin – 관리용 사이트. 곧 사용하게 될 겁니다.
- django.contrib.auth – 인증 시스템.
- django.contrib.contenttypes – 컨텐츠 타입을 위한 프레임워크.
- django.contrib.sessions – 세션 프레임워크.
- django.contrib.messages – 메세징 프레임워크.
- django.contrib.staticfiles – 정적 파일을 관리하는 프레임워크.
이 어플리케이션들은 일반적인 경우에 사용하기 편리하도록 기본으로 제공되어 진다.
기본 어플리케이션들 중 몇몇은 최소한 하나 이상의 데이터베이스 테이블을 사용하는데, 그러기 위해서는 데이터베이스에 테이블을 미리 만들 필요가 있다.
만드는 방법은 아래 명령을 실행해야한다.
python manage.py migrate
migrate 명령은 INSTALLED_APPS 의 설정을 탐색하여, mysite/settings.py 의 데이터베이스 설정과 app 과 함께 제공되는 database migrations 에 따라, 필요한 데이터베이스 테이블을 생성합니다.
수행시 각 migration 이 적용되는 메세지가 화면에 출력되는 것을 확인할 수 있다.
어떤 내용이 생성되었는지 궁금하다면, 데이터베이스 클라이언트로 접속한 후, \dt (PostgreSQL), SHOW TABLES; (MariaDB, MySQL), .tables (SQLite),
SELECT TABLE_NAME FROM USER_TABLES; (Oracle) 을 통해 Django 가 생성한 테이블을 확인해 볼 수 있다.
'''
minimalists 들은 기본으로 제공되는 어플리케이션에 일반적인 상황을 염두해 두었으나, 모두에게 필요한 부분이 아닌 부분들은 migrate를 실행하기 전에 INSTALLED_APPS 에서 제거할 어플리케이션들을 그냥 주석처리하거나 삭제 처리하면된다.
migrate 명령어는 INSTALLED_APPS 에 등록된 어플리케이션에 한하여 실행 될 것이다.
'''
모델 만들기
본질적으로, 모델이란 부가적인 메타데이터를 가진 데이터베이스 구조를 말합니다.
여론조사 앱에서 Question 과 Choice``이라는 두 가지 모델을 만들 것입니다.
``Question 에는 질문과 발행일을 위한 두 개의 필드를 가지며,
Choice 는 선택 텍스트와 투표 집계를 위한 두 개의 필드를 가지며,
각각의 ``Choice``모델은 ``Question``과 연관됩니다,
이러한 개념은 Python 클래스로 표현됩니다. file: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)
여기서 각 모델은 :class:`django.db.models.Model`의 하위 클래스로 표현되는데.
모델마다 여러 클래스 변수가 있으며, 각 클래스 변수는 모델에서 데이터베이스 필드를 나타내고 있습니다.
데이터베이스의 각 필드는 Field 클래스의 인스턴스로서 표현되며,
CharField 는 문자(character) 필드를 표현하고, DateTimeField 는 날짜와 시간(datetime) 필드를 표현합니다.
각 필드가 어떤 자료형을 가질 수 있는지를 Django 에게 전달하는 역할을 합니다.
각각의 Field 인스턴스의 이름(question_text 또는 pub_date)은 기계가 읽기 좋은 형식(machine-friendly format)의 데이터베이스 필드 이름입니다.
이 필드명을 Python 코드에서 사용할 수 있으며, 데이터베이스에서는 컬럼명으로 사용되어 집니다.
Field 클래스의 생성자에 선택적인 첫번째 위치 인수를 전달하여 사람이 읽기 좋은(human-readable) 이름을 지정할 수 있으며, 이 방법은 Django 의 내부를 설명하는 용도로 종종 사용되어 진다.
이는 마치 문서가 늘어나는 것 같은 효과를 가지는데. 만약 이 선택적인 첫번째 위치 인수를 사용하지 않으면, Django 는 기계가 읽기 좋은 형식의 이름을 사용합니다.
이번 예제에서는, Question.pub_date 에 한해서만 인간이 읽기 좋은 형태의 이름을 정의했고. 그 외의 다른 필드들은, 기계가 읽기 좋은 형태의 이름이라도 사람이 읽기에는 충분할 것입니다.
몇몇 Field 클래스들은 필수 인수가 필요한데. 예를 들어, CharField 의 경우 max_length 를 입력해 주어야 합니다.
이것은 데이터베이스 스키마에서만 필요한것이 아닌 값을 검증할때도 쓰이게 됩니다.
또한 Field 는 다양한 선택적 인수들을 가질 수 있습니다. 이 예제에서는, default 로 하여금 votes 의 기본값을 0 으로 설정하였습니다.
마지막으로, ForeignKey 를 사용한 관계설정에 대해 보면 각각의 Choice 가 하나의 Question 에 관계된다는 것을 Django 에게 알려줍니다. Django 는 다-대-일(many-to-one), 다-대-다(many-to-many), 일-대-일(one-to-one) 과 같은 모든 일반 데이터베이스의 관계들를 지원하고 있습니다.
모델의 활성화
모델에 대한 이 작은 코드가, Django에게는 상당한 양의 정보를 전달하며, Django는 이 정보를 가지고 아래와 같은 일을 할 수 있다.
- 이 앱을 위한 데이터베이스 스키마 생성(CREATE TABLE 문)
- Question과 Choice 객체에 접근하기 위한 Python 데이터베이스 접근 API를 생성
그러나, 가장 먼저 현재 프로젝트에게 polls 앱이 설치되어 있다는 것을 알려야 합니다.
'''
Django 앱들은 꼈다뺐다가 가능한데, 이를 통해 앱을 다수의 프로젝트에서 사용할 수 있고, 앱을 배포할 수 있다. 특정 Django 사이트에 앱들이 묶여있지 않아도 되기 때문이다.
앱을 현재의 프로젝트에 포함시키기 위해서는, 앱의 구성 클래스에 대한 참조를 INSTALLED_APPS 설정에 추가해야 하는데, PollsConfig 클래스는 polls/apps.py 파일 내에 존재한다.
따라서, 점으로 구분된 경로는 'polls.apps.PollsConfig'가 되며. 이 점으로 구분된 경로를, mysite/settings.py 파일을 편집하여 INSTALLED_APPS 설정에 추가하면 됩니다. 이는 다음과 같이 보일 것입니다
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 polls
이후 커멘더 창을 보면 아래와 같습니다.
Migrations for 'polls':
polls/migrations/0001_initial.py
+ Create model Question
+ Create model Choice
makemigrations 을 실행시킴으로서, 모델을 변경시킨 사실과 변경사항을 migration으로 저장시키고 싶다는 것을 Django에게 전달한 것입니다.
Migration은 Django가 모델의 변경사항을 디스크에 저장하는 방법입니다.
원하는 경우 polls/migrations/0001_initial.py 파일로 저장된 새 모델에 대한 migration을 읽어볼 수 있으며,
Django가 migration을 만들 때마다 읽을 것으로 기대되지는 않지만, Django의 변경점을 수동으로 수정하기를 원할 때를 대비해서 사람이 수정할 수 있도록 설계되어 있다.
migration들을 실행시켜주고, 자동으로 데이터베이스 스키마를 관리해주는 migrate 명령어가 있으며. 이 명령을 알아보기 전에 migration이 내부적으로 어떤 SQL 문장을 실행하는지 살펴볼 수 있는 것이다.
sqlmigrate 명령은 migration 이름을 인수로 받아, 실행하는 SQL 문장을 보여준다.
python manage.py sqlmigrate polls 0001
이렇게 하면 아래와 같은 비슷한 결과를 볼 수 있다.
BEGIN;
--
-- Create model Question
--
CREATE TABLE "polls_question" (
"id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
"question_text" varchar(200) NOT NULL,
"pub_date" timestamp with time zone NOT NULL
);
--
-- Create model Choice
--
CREATE TABLE "polls_choice" (
"id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
"choice_text" varchar(200) NOT NULL,
"votes" integer NOT NULL,
"question_id" bigint NOT NULL
);
ALTER TABLE "polls_choice"
ADD CONSTRAINT "polls_choice_question_id_c5b4b260_fk_polls_question_id"
FOREIGN KEY ("question_id")
REFERENCES "polls_question" ("id")
DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");
COMMIT;
사용하는 DB에 따라 출력결과는 다르며 위 결과는 PostgreSQL 에서 생성된 것이다.
- 테이블 이름은 앱의 이름과 모델의 이름(소문자)이 조합되어 자동으로 생성되며, 이 경우, 앱의 이름인 polls 와 소문자로 표기된 모델의 이름인 question 과 choice가 합쳐진다. (이 동작을 재지정(override)하여 수정할 수 있습니다.)
- 기본 키(ID)가 자동으로 추가된다. (재지정 가능)
- 관례에 따라, Django는 외래 키 필드명에 "_id" 이름을 자동으로 추가한다. (재지정 가능)
- 외래 키 관계는 FOREIGN KEY 라는 제약에 의해 명시되며. DEFERRABLE 부분은 PostgreSQL에 트랜잭션이 끝날 때까지 외래 키를 강제하지 말라고 알려주는 것이다.
- 사용하는 데이터베이스에 따라, 데이터베이스 고유의 필드타입이 조정되며, 자동 증가 필드를 생성할 경우 ``auto_increment``(MySQL), ``bigint PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY``(PostgreSQL) 또는 ``integer primary key autoincrement``(SQLite)와 같이 사용하는 데이터베이스에 따라 적절한 필드타입이 자동으로 선택되고 필드 명에 사용되는 인용부호도 상황에 따라 겹따옴표나 홑따옴표가 적절히 선택된다.
- sqlmigrate 명령은 실제로 데이터베이스에서 마이그레이션을 실행하는 것이 아니라 화면에 인쇄하여 필요한 SQL Django를 확인할 수 있도록 합니다. 이것은 Django가 수행할 작업이나 변경을 위해 SQL 스크립트를 필요로 하는 데이터베이스 관리자가 있는지 확인하는 데 유용합니다.
관심이 있다면, python manage.py check 명령을 통해 마이그레이션을 수행하거나 데이터베이스를 건드리지 않고도 프로젝트의 문제를 확인할 수 있으며 이제, migrate 를 실행시켜 데이터베이스에 모델과 관련된 테이블을 생성 해보면 아래와 같다.
$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
Rendering model states... DONE
Applying polls.0001_initial... OK
migrate 명령은 아직 적용되지 않은 마이그레이션을 모두 수집해 이를 실행하며(Django는 django_migrations 테이블을 두어 마이그레이션 적용 여부를 추적합니다) 이 과정을 통해 모델에서의 변경 사항들과 데이터베이스의 스키마의 동기화가 이루어지게 된다.
마이그래이션은프로젝트를 개발할 때처럼 데이터베이스나 테이블에 손대지 않고도 모델의 반복적인 변경을 가능하게 해주며, 동작 중인 데이터베이스를 자료 손실 없이 업그레이드 하는 데 최적화 되어 있다.
모델의 변경을 만드는 세 단계의 지침은 아래와 같다.
- (models.py 에서) 모델을 변경합니다.
- python manage.py makemigrations을 통해 이 변경사항에 대한 마이그레이션을 만드세요.
- python manage.py migrate 명령을 통해 변경사항을 데이터베이스에 적용하세요.
마이그레이션을 만드는 명령과 적용하는 명령이 분리된 것은 버전 관리 시스템에 마이그레이션을 커밋하고 앱과 함께 출시할 수 있도록 하기 위해서입니다. 이를 통해 개발이 쉬워질뿐더러 다른 개발자 프로덕션에 사용 가능하다.
manage.py 유틸리티로 어떤 일들을 할 수 있는지 django-admin 문서를 읽어보면 된다.
https://docs.djangoproject.com/ko/5.1/ref/django-admin/
django-admin and manage.py | Django 문서
The web framework for perfectionists with deadlines.
docs.djangoproject.com
API 가지고 놀기
Python 쉘을 실행하려면 다음의 명령을 입력합니다.(이번에는 장고 api를 사용해보겠습니다)
python manage.py shell
단순히 python 입력하는 대신 이걸 사용하는 이유는 manage.py 에 설정된 DJANGO_SETTINGS_MODULE 환경변수 때문이고. 이 변수는 Django에게 mysite/settings.py 의 Python 가져오기 경로를 제공한다.
처음으로 shell에 들어오면 database API 탐색을 해보겠습니다.
>>> 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)>]>
<Question: Question object (1)>은 이 객체를 표현하는 데 별로 도움이 되지 않기에,
(polls/models.py 파일의) Question 모델을 수정하여, __str__() 메소드를 Question과 Choice에 추가해 봅시다.
polls/models.py
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
모델에 __str__() 메소드를 추가하는것은 객체의 표현을 대화식 프롬프트에서 편하게 보려는 이유 말고도, Django 가 자동으로 생성하는 관리 사이트 에서도 객체의 표현이 사용되기 때문입니다.
이 모델에 커스텀 메소드 또한 추가해보겠습니다.
import datetime
from django.db import models
from django.utils import timezone
class Question(models.Model):
# ...
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
import datetime은 Python의 표준 모듈인 datetime 모듈을, from django.utils import timezone은 Django의 시간대 관련 유틸리티인 django.utils.timezone을 참조하기 위해 추가한 것이며.
만약 Python에서 시간대를 조작하는 방법에 대해 익숙하지 않다면, 시간대 지원 문서에서 더 많은 것을 배울 수 있습니다.
https://docs.djangoproject.com/ko/5.1/topics/i18n/timezones/
Time zones | Django 문서
The web framework for perfectionists with deadlines.
docs.djangoproject.com
이러한 변경 사항을 저장하고, ``python manage.py shell``을 다시 실행하여 새로운 대화형 shell을 실행하면 된다.
>>> from polls.models import Choice, Question
# Make sure our __str__() addition worked.
>>> Question.objects.all()
<QuerySet [<Question: What's up?>]>
# Django provides a rich database lookup API that's entirely driven by
# keyword arguments.
>>> Question.objects.filter(id=1)
<QuerySet [<Question: What's up?>]>
>>> Question.objects.filter(question_text__startswith="What")
<QuerySet [<Question: What's up?>]>
# Get the question that was published this year.
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)
<Question: What's up?>
# Request an ID that doesn't exist, this will raise an exception.
>>> Question.objects.get(id=2)
Traceback (most recent call last):
...
DoesNotExist: Question matching query does not exist.
# Lookup by a primary key is the most common case, so Django provides a
# shortcut for primary-key exact lookups.
# The following is identical to Question.objects.get(id=1).
>>> Question.objects.get(pk=1)
<Question: What's up?>
# Make sure our custom method worked.
>>> q = Question.objects.get(pk=1)
>>> q.was_published_recently()
True
# Give the Question a couple of Choices. The create call constructs a new
# Choice object, does the INSERT statement, adds the choice to the set
# of available choices and returns the new Choice object. Django creates
# a set (defined as "choice_set") to hold the "other side" of a ForeignKey
# relation (e.g. a question's choice) which can be accessed via the API.
>>> q = Question.objects.get(pk=1)
# Display any choices from the related object set -- none so far.
>>> q.choice_set.all()
<QuerySet []>
# Create three choices.
>>> q.choice_set.create(choice_text="Not much", votes=0)
<Choice: Not much>
>>> q.choice_set.create(choice_text="The sky", votes=0)
<Choice: The sky>
>>> c = q.choice_set.create(choice_text="Just hacking again", votes=0)
# Choice objects have API access to their related Question objects.
>>> c.question
<Question: What's up?>
# And vice versa: Question objects get access to Choice objects.
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>> q.choice_set.count()
3
# The API automatically follows relationships as far as you need.
# Use double underscores to separate relationships.
# This works as many levels deep as you want; there's no limit.
# Find all Choices for any question whose pub_date is in this year
# (reusing the 'current_year' variable we created above).
>>> Choice.objects.filter(question__pub_date__year=current_year)
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
# Let's delete one of the choices. Use delete() for that.
>>> c = q.choice_set.filter(choice_text__startswith="Just hacking")
>>> c.delete()
모델의 관계에 대한 더 많은 정보는 관련 객체에 접근하기를 통해 참조할 수 있다.
https://docs.djangoproject.com/ko/5.1/ref/models/relations/
Related objects reference | Django 문서
The web framework for perfectionists with deadlines.
docs.djangoproject.com
API에서 이중 밑줄(__)을 이용해서 어떻게 필드를 조회할 수 있는지는 필드 조회를 통해 알 수 있다.
https://docs.djangoproject.com/ko/5.1/topics/db/queries/#field-lookups-intro
쿼리 만들기 | Django 문서
The web framework for perfectionists with deadlines.
docs.djangoproject.com
이후 데이터베이스 API에 대한 자세한 내용을 보려면, 데이터베이스 API 레퍼런스를 읽오보면 될 것이다.
https://docs.djangoproject.com/ko/5.1/topics/db/queries/
쿼리 만들기 | Django 문서
The web framework for perfectionists with deadlines.
docs.djangoproject.com
Django 관리자 소개
본래 직원들이나 고객들이 컨텐츠를 수정하기 위한 관리자 사이트를 만드는건 복잡한 작업인데, Django는 모델에 대한 관리용 인터페이스를 모두 자동으로 생성합니다.
Django 에서 제공하는 관리자 사이트는 사이트 방문자를 위한 것이 아닌, 사이트 관리자를 위한 것이다.
관리자 생성하기
우선은 관리 사이트에 로그인 할 수 있는 사용자를 생성해 보겠습니다.
python manage.py createsuperuser
원하는 username 을 입력하고 엔터를 누르면된다.(원하는 이름으로!!)
Username: admin
이후 원하는 이메일 주소를 입력하라는 메시지가 표시된다.
Email address: admin@example.com
마지막으로 암호를 입력하면 되는데, 암호를 두 번 물어보고, 두 번째 입력하는 암호를 올바로 입력했는지를 확인하기 위한 암호이다.
Password: **********
Password (again): *********
Superuser created successfully.
개발 서버 시작
django 관리자 사이트는 기본으로 활성화되어 있는데, 개발 서버를 켜고 살펴볼 수 있다.
우선 살표보기 위해 서버를 동작시키면 아래와 같다.
python manage.py runserver
이제 웹 브라우저를 열고 로컬 도메인의 “/admin/”으로 이동한다. (예: http://127.0.0.1:8000/admin/). 그러면 관리자의 로그인 화면이 나타나는 것이다.
translation 이 기본적으로 설정되어 있으므로 LANGUAGE_CODE 를 설정하면, 로그인 화면이 지정된 언어로 표시된다.(Django 번역이 적절한 경우).
관리자 사이트에 들어가기¶
앞서 생성한 슈퍼유저(superuser) 계정으로 로그인해봅시다. 다음과 같은 Django 관리 인덱스 페이지가 보일 것입니다.
편집 가능한 그룹과 사용자와 같은 몇 종류의 컨텐츠를 볼 수 있는데, 이것들은 django.contrib.auth 모듈에서 제공되는데 이는 django에서 제공되는 인증 프레임워크 이다.
관리 사이트에서 poll app 을 변경가능하도록 만들기
poll app 이 관리 인덱스 페이지에서 보이지 않는데? 이를 보려면
한 가지 더 해야 할 일은 관리자에게 ‘’질문’’ 대상에는 관리 인터페이스가 있다고 알려주는 것이다.
이렇게 하려면 polls/admin.py 파일을 열어 다음과 같이 편집하면 된다.
from django.contrib import admin
from .models import Question
admin.site.register(Question)
자유로운 관리 기능을 탐색하기
Question 을 등록시키면 Django 는 이를 알아채고 관리 인덱스 페이지에 이를 표시하게 되는 것이다.
“Questions” 을 클릭하면. 질문들을 위한 “change list” 로 이동합니다.
이 페이지는 데이터베이스에 저장된 모든 질문들을 보여주며, 그 중 하나를 선택하여 변경할 수 있고, 이전에 등록했던 “What’s up?” 질문이 있을 것입니다
“What’s up?” 질문을 클릭하여 수정합니다.
여기서 알아둘 것들:
- 이 서식은 Question 모델에서 자동으로 생성됩니다.
- 모델의 각 필드 유형들은 (DateTimeField, CharField) 적절한 HTML 입력 위젯으로 표현되며, 필드의 각 유형들은 Django 관리 사이트에서 어떻게 표현해되어야 할지 알고 있다.
- 각각의 DateTimeField 는 JavaScript 로 작성된 단축 기능과 연결되며. 날짜는 “오늘”(“Today”) 버튼과 달력 팝업에서 입력할 수 있고, 시간은 “지금”(“Now”) 버튼과 일반적으로 입력하는 시간들을 제공하는 편리한 팝업을 통해서도 입력할 수 있다.
페이지의 아래 부분에서 다음과 같은 몇가지 옵션을 제공하고 있는데
- 저장(Save) – 이 유형의 객체에 대한 변경사항을 저장하고, 변경된 목록 페이지를 보여줍니다
- 저장 및 편집 계속(Save and continue editing) – 이 객체에 대한 변경사항을 저장하고, 현재 편집창을 갱신합니다
- 저장 및 다른 이름으로 추가(Save and add another) – 변경사항을 저장하고, 이 유형의 객체에 대한 비어있는 새로운 입력창을 불러옵니다
- 삭제(Delete) – 삭제를 확인하는 페이지를 띄웁니다.
만약 “Date published” 의 값이 Tutorial 1 에서 질문을 생성했을때의 시간과 일치하지 않는다면, TIME_ZONE (시간대) 설정을 놓친것이다. 이 설정을 바꾸시고 다시 페이지를 불러오시면 올바른 값이 표현되며
“Date published” 의 값을 “오늘”(“Today”) 과 “지금”(“Now”) 단축버튼을 눌러 바꾸십시요. 그런 후, “저장 및 편집 계속”(“Save and continue editing”) 을 누르면 된다. 그런 후, 우측 상단의 “히스토리”(“History”) 버튼을 누르면. Django 관리사이트를 통해 누가(username) 언제(timestamp) 무엇을 바꾸었는지 목록을 확인할 수 있다.
여기까지 모델 API와 관리 사이트에 익숙해졌다면, 다음은 투표 앱에 뷰를 추가하는 방법을 배워보겠습니다.
'PYTHON-BACK' 카테고리의 다른 글
Django_tutorial_var4 (1) | 2025.01.22 |
---|---|
Django_tutorial_var3 (0) | 2025.01.21 |
Django_tutorial_var1 (0) | 2025.01.20 |
# 24.11.28_영화추천 사이트 제작_협업 기반 필터링 (0) | 2024.11.28 |
# 24.11.19_영화추천 사이트 제작 (2) | 2024.11.19 |