migrate
$ python manage.py migrate
- migrate ๋ช
๋ น์ ์์ง ์ ์ฉ๋์ง ์์ ๋ง์ด๊ทธ๋ ์ด์
์ ๋ชจ๋ ์์งํด ์ด๋ฅผ ์คํํ๋ค.
- Django๋ django_migrations ํ
์ด๋ธ์ ๋์ด ๋ง์ด๊ทธ๋ ์ด์
์ ์ฉ ์ฌ๋ถ๋ฅผ ์ถ์ ํ๋ค.
- ์ด ๊ณผ์ ์ ํตํด ๋ชจ๋ธ์์์ ๋ณ๊ฒฝ ์ฌํญ๋ค๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์คํค๋ง ๋๊ธฐํ๊ฐ ์ด๋ฃจ์ด์ง๋ค.
migration
- ๋ง์ด๊ทธ๋ ์ด์
์ด๋?
- ๋ชจ๋ธ์ ๋ณ๊ฒฝ ๋ด์ญ์ DB ์คํค๋ง์ ์ ์ฉ์ํค๋ ์ฅ๊ณ ์ ๋ฐฉ๋ฒ
- ์คํค๋ง๋?
- DB๋ด์ ์ด๋ค ๊ตฌ์กฐ๋ก ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋๊ฐ ๋ฅผ ๋ํ๋ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ๋ฅผ ์คํค๋ง๋ผ๊ณ ํ๋ค.
- ์ฅ๊ณ ๋ ORM(ํ์ด์ฌ ์ธ์ด๋ฅผ SQL๋ฌธ์ผ๋ก ๋ณ๊ฒฝํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ models.py์ ํด๋์ค๋ฅผ ํตํด DB ์คํค๋ง๋ฅผ ์์ฑํ๊ณ ์ปจํธ๋กค ํ๊ฒ ๋๋ค.
- ์ด ๋ DB ์คํค๋ง๋ฅผ git์ฒ๋ผ ๋ฒ์ ์ผ๋ก ๋๋ ์ ๊ด๋ฆฌ ํ ์ ์๊ฒ ํด ์ฃผ๋ ์์คํ
์ด๋ผ ์๊ฐํ๋ฉด ๋๋ค.
- ๋ง์ด๊ทธ๋ ์ด์
์ ๋งค์ฐ ๊ธฐ๋ฅ์ด ๊ฐ๋ ฅํ๋ค.
- ๋ง์น ํ๋ก์ ํธ๋ฅผ ๊ฐ๋ฐํ ๋์ฒ๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํ
์ด๋ธ์ ์๋์ง ์๊ณ ๋ ๋ชจ๋ธ์ ๋ฐ๋ณต์ ์ธ ๋ณ๊ฒฝ์ ๊ฐ๋ฅํ๊ฒ ํด์ค๋ค.
- ๋์ ์ค์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์๋ฃ ์์ค ์์ด ์
๊ทธ๋ ์ด๋ ํ๋๋ฐ ์ต์ ํ ๋์ด ์๋ค.
- ๋ชจ๋ธ์ ๋ณ๊ฒฝ์ ๋ง๋๋ ์ธ ๋จ๊ณ์ ์ง์นจ
- models.py ์์ ๋ชจ๋ธ์ ๋ณ๊ฒฝํ๋ค
- python manage.py makemigrations์ ํตํด ๋ณ๊ฒฝ์ฌํญ์ ๋ํ ๋ง์ด๊ทธ๋ ์ด์
์ ๋ง๋ ๋ค
- python manage.py migrate ๋ช
๋ น์ ํตํด ๋ณ๊ฒฝ์ฌํญ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฉํ๋ค.
migrate & makemigrations
- ๋ง์ด๊ทธ๋ ์ด์
์ ๋ง๋๋ ๋ช
๋ น๊ณผ ์ ์ฉํ๋ ๋ช
๋ น์ด ๋ถ๋ฆฌ๋ ์ด์
- ๋ฒ์ ๊ด๋ฆฌ ์์คํ
์ ๋ง์ด๊ทธ๋ ์ด์
์ ์ปค๋ฐํ๊ณ ์ฑ๊ณผ ํจ๊ป ์ถ์ํ ์ ์๋๋ก ํ๊ธฐ ์ํด์์ด๋ค.
django cycle
- ํด๋ผ์ด์ธํธ์ธ ์ฌ์ฉ์๋ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์น ์ดํ๋ฆฌ์ผ์ด์
์ ๋ณด๊ธฐ ์ํด์ ์์ฒญ์ ํ๊ธฐ ๋๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ํ๋ฉด ์น ์๋ฒ์ธ Nginx ๋ Apache๊ฐ ์์ฒญ์ ๋ง์ดํ๋ค.
- Nginx, Apache๋ผ๋ ์น ์๋ฒ๊ฐ ์กด์ฌํ๋๋ฐ, ์ด ๋์ ํํ ๊ต์ฐจํด์ ์ฌ์ฉํ๋ค.
- Django์์๋ ๊ฐ๋ฐ์ ์ํด์ ๊ฒฝ๋ ๊ฐ๋ฐ ์น ์๋ฒ๊ฐ ์ด๋ฏธ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค ๋ ์ธํ
์ด ๋์ด ์๋ค.
- ๊ฐ๋ฐ์ ํ ๋๋ ๊ฒฝ๋ ์น ์๋ฒ๋ฅผ ์ฌ์ฉํ๊ณ ์ค์ ๋ฐฐํฌํ ๋๋ Nginx๋ Apache์ ๊ฐ์ ์น ์๋ฒ๋ฅผ ์ฌ์ฉํ๋ค.
- WSGI๋ ์น ์๋ฒ์ Django ํ๋ ์์ํฌ๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ์ํด์ ์ฌ์ฉ๋๋ค.
- ์ฌ์ฉ์๊ฐ ํน์ ์ฃผ์๋ฅผ ์์ฒญํ๋ฉด URL ํ์ผ์์ ์์ฒญํ ์ฃผ์๋ฅผ ์๊ฒ ๋๋์ด์ค๋ค.
- ์ด ๊ณผ์ ์ ํ์ฑ(parsing)์ด๋ผ๊ณ ํ๋ค.
- ์๊ฒ ๋๋์ด์ง ์ฃผ์๋ค์ ์ญํ ์ ๋ง๊ฒ view๋ก ์ด๋ํ๋ค.
- view์๋ ์น ์ดํ๋ฆฌ์ผ์ด์
์ ๊ฐ๊ฐ ๋ง๋ ์์
์ ํ๊ธฐ ์ํด ์์ฑํ ์ฝ๋๊ฐ ์๋ค.
- ์ฝ๋์ ์ข
๋ฅ
- ์์ฒญ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊บผ๋ด์ด
- pdf๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์์
- view ์์
์ด ๋๋๋ฉด ๋์์ธ ๋ด๋น์ธ template์ผ๋ก ์ด๋ํ๋ค.
- ์ฌ์ฉ์๋ ์์ฒญ์ ๋ํ ์๋ต์ ๋ฐ๊ฒ ๋๋ค.
- ํด๋ผ์ด์ธํธ๋ ์ ๊ณผ์ ์ด ๋๋ ํ์ ์์ฒญํ ํ๋ฉด์ ๋ณผ ์ ์๊ฒ ๋๋ค.
ํ๋ก์ ํธ(project) vs ์ฑ(app)
- ํ๋ก์ ํธ๋ ์ฑ์ ๋ฌถ์์ด๋ค.
- ์ฑ์ ํน์ ํ ๊ธฐ๋ฅ์ ์ํํ๋ ์ฑ ์ดํ๋ฆฌ์ผ์ด์
์ด๋ค.
- ํน์ ํ ๊ธฐ๋ฅ์ด๋
- ์์ด์คํฌ๋ฆผ ๊ฐ๊ฒ๋ฅผ ์ฐจ๋ฆฌ๋๋ฐ, ์ด ๊ฐ๊ฒ๋ฅผ ์ํ ์ฑ์ ๋ง๋ ๋ค๊ณ ํ์
- ์์ด์คํฌ๋ฆผ ๊ด๋ฆฌ๋ฅผ ์ํ ๊ด๋ฆฌ ์ฑ, ์ฃผ๋ฌธ์ ์ํ ์ฃผ๋ฌธ ์ฑ, ๊ฐ๊ฒ ์ด๋ฒคํธ ๊ด๋ฆฌ๋ฅผ ์ํ ์ด๋ฒคํธ ์ฑ
- ์์ ๊ฐ์ด ํน์ ๊ธฐ๋ฅ์ ์ํํ๋ ์ฑ์ ๊ฐ๊ฐ ์์ฑํด์ ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ์ด๋ค.
urls.py์ ์ ์ฒด์ ์ธ ํ๋ฆ
mysite/urls
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
polls/urls
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
- ์ต์์ url.py์์ ์ฐ๋ฆฌ๊ฐ ์์ฑํ url์ ์ฐ๊ฒฐํด ์ฃผ์๋ค.
- ex) 127.0.0.1/polls ๋ผ๋ url์ด ์ต์์ url์ ๋ค์ด์๋ค๋ฉด, ์ด url์ ํ์ฑํด์ polls๋ผ๋ ํด๋น path๋ฅผ ์ก์๋ด๊ณ polls์ฑ์ url๋ก ์ฐ๊ฒฐ์์ผ ์ค๋ค.
- ์ต์์ url์์ url์ ํ์ฑํ์ฌ ๋ฐ์์ฃผ๊ณ path๋ณ๋ก ๋ค๋ฅธ ์ฑ์ผ๋ก ๋ถ๊ธฐ๋ฅผ ์์ผ์ค๋ค
- ์ฑ์ด ์ฌ๋ฌ๊ฐ ์๋ค๋ฉด url์ ๋ฐ๋ผ ํ์ฑ์ ํด์ฃผ๊ณ path์ ๋ฐ๋ฅธ ์ฑ์ผ๋ก ๋ถ๊ธฐ๋ฅผ ์์ผ์ค๋ค.
- polls/urls๊ฐ ์ต์์ urls.py์์ ์์ฒญ์ ์ ๋ฌ๋ฐ์ผ๋ฉด path๋ด์์ view.index๋ผ๋ view ๋ด๋ถ๋ก ์ฐ๊ฒฐ์ ์์ผ์ค๋ค.
- view ๋ด๋ถ์ index ํจ์์ ์๋ต์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํด์ค๋ค.
settings.py
mysite/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
- ์ธํ
ํ์ผ์๋ ์ด๋ฌํ ์ฝ๋๊ฐ ์กด์ฌํ๋ค.
- INSTALLED_APPS ์์ ์๋ ์ฑ๋ค์ ๊ฐ๊ฐ์ ๊ธฐ๋ฅ์ ์ํํ๊ณ ์๋ค.
- INSTALLED_APPS์์ ์ฑ์ ๋ช
์ํ๋ฉด, '์ด๋ฌํ ์ฑ๋ค์ ์ฌ์ฉํ๊ฒ ๋ค.' ๋ผ๊ณ Django์๊ฒ ์ด์ผ๊ธฐ ํ๋ ๊ฒ์ด๋ค.
- ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์ ๋ ์ฑ๋ค์ด๋ค.
$ python manage.py migrate
- ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ ์ฑ๋ค์ ์ต์ํ ํ๋ ์ด์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ์ ์ฌ์ฉํ๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ์ ์ฌ์ฉํ๊ธฐ ์ํด์ ์์ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋ฉด ๋๋ค.
๋ชจ๋ธ ๋ง๋ค๊ธฐ
- tutorial์์ ๋ง๋๋ ์ค๋ฌธ์กฐ์ฌ ์ฑ์ ๋ค์๊ณผ ๊ฐ์ ๋ฐ์ดํฐ ์ ์ฅ์ ํ์๋ก ํ๋ค.
- ์ง๋ฌธ (Question)
- ์ง๋ฌธ (question)
- ๋ฐํ์ผ (publication date)
- ์ฌ์ฉ์๊ฐ ์ง๋ฌธ์ ๋ํ ์ ํ์ ํ ์ ์๋ ๋ฆฌ์คํธ (Choice)
- ์ ํ์ง (choice)
- ํ (vote)
- Question๊ณผ Choice์ ๋ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ธ์ ๋ง๋ค ์ ์๋ค.
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)
- ์ฐ๋ฆฌ๊ฐ ๋ง๋ database ๋ชจ๋ธ์ Question๊ณผ Choice๊ฐ ์๋ค.
- Question: ์ง๋ฌธ ๋ด์ฉ, ์์ฑ ๋ ์ง
- ์ง๋ฌธ์ ๋ฐ์ดํฐํ
- question_text = models.CharField(max_length=200)
- ๋ฌธ์, ์ต๋๊ธธ์ด 200์
- pub_date = models.DateTimeField('date published')
- ๋ฐํ์ผ, ์๊ฐํ
์ด๋ธ์ ๊ฐ์ง๊ณ ์๋ค.
- Choice: ์ ํ์ง์ ํด๋นํ๋ ์ง๋ฌธ, ํฌํ์
- ์ง๋ฌธ์ ๋ฐ์ดํฐํ
- question = models.ForeignKey(Question, on_delete=models.CASCADE)
- ์ธ๋ํค(ForeignKey): Question์ด๋ผ๋ ๋ฐ์ดํฐ๋ชจ๋ธ์ ์ฐธ์กฐํ๊ฒ ๋ค.
- Choice ๋ด์ ์๋ question์ ์์ฑ๋ Question์ ๊ฐ๋ฆฌํค๊ณ ์๋ค.
- CASCADE: ์์ class Question์ด ์ญ์ ๊ฐ ๋๋ฉด Choice๋ด์ question๋ ์ญ์ ๊ฐ ๋๋ค๋ผ๋ ๋ป
- ForeignKey
- Question์ด๋ผ๋ ํ
์ด๋ธ์ด ์๊ณ , Choice๋ผ๋ ํ
์ด๋ธ์ด ์กด์ฌํ๋ค.
- Choice ํ
์ด๋ธ ๋ด์ question์ Question ํ
์ด๋ธ์ ์ฐธ์กฐํ๊ณ ์๋ค.
- ํ๋์ Question ํ
์ด๋ธ์ ์ฌ๋ฌ ๊ฐ์ Choice๋ฅผ ๊ฐ๋ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ 1:๋ค ๊ตฌ์กฐ์ด๋ค.
๋ชจ๋ธ์ ํ์ฑํ
- ์ฅ๊ณ ์ ์ฒ ํ
- ์ฑ๋ณ๋ก ๊ธฐ๋ฅ์ด ๋๋์ด์ ธ์๋ค.
- ์ฑ์ ๋ฑ๋ก์ ํ๋๋ ํ์ง ์๋๋์ ๋ฐ๋ผ์ ์ฑ์ ์ฌ์ฉํ์ง ์๊ฒ ๋ค, ์ฑ์ ์ฌ์ฉํ๊ฒ ๋ค ๋ช
์๋ฅผ ํด์ค ์ ์๋ค.
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',
]
- ์์ฒ๋ผ ์ธํ
ํ์ผ์ ๋ง๋ polls ์ฑ์ ๋ฑ๋กํด ์ค๋ค.
- 'polls.apps.PollsConfig'
- 'polls ์ฑ ํ์ผ์์ apps ํ์ผ์ PollsConfig๋ฅผ ๋ฑ๋กํ๊ฒ ๋ค.' ๋ผ๋ ๋ป
$ python manage.py makemigrations polls
- makemigrations
- ๋ชจ๋ธ์ ์์ฑํ๊ณ migration์ด๋ผ๋ ์ฅ์์๋ค ์ด ๋ชจ๋ธ๋ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด์ ํ
์ด๋ธ์ ์์ฑํ ์ ์๋๋ก ์ค๊ณ๋๋ฅผ ๋ง๋๋ ์์
python manage.py makemigrations polls
Migrations for 'polls':
polls/migrations/0001_initial.py
- Create model Question
- Create model Choice
- ์์ ํ๋ฉด์ด ์ถ๋ ฅ๋์๋ค๋ฉด migrations ๋๋ ํ ๋ฆฌ์์ 0001_initial.py์ด๋ผ๋ ํ์ผ์ด ์์ฑ๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
polls/migrations/0001_initial.py
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Question',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('question_text', models.CharField(max_length=200)),
('pub_date', models.DateTimeField(verbose_name='date published')),
],
),
migrations.CreateModel(
name='Choice',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('choice_text', models.CharField(max_length=200)),
('votes', models.IntegerField(default=0)),
('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='polls.question')),
],
),
]
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ด์ ํ
์ด๋ธ์ ์์ฑํ๊ธฐ ์ํ ์ค๊ณ๋๊ฐ ๋ง๋ค์ด์ง ๊ฒ์ ๋ณผ ์ ์๋ค.
python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
Applying polls.0001_initial... OK
- ์ด์ migrate๋ฅผ ํ๋ฉด ์์
์ด ์๋ฃ๋๋ค.
API ๊ฐ์ง๊ณ ๋๊ธฐ
- API๋
- ๊ฐ๋ฐ์๊ฐ ํ์๋ก ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฝ์๋ผ ์ ์๋๋ก ๋ง๋ค์ด๋์ ํจ์,์๋ฒ, ๋ฐ์ดํฐ๋ฒ ์ด์ค์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํ ์ ์๋๋ก ๋ง๋ค์ด ๋์ ํจ์๊ฐ์ ๊ฒ
>>> from polls.models import Choice, Question
- ๋ง๋ค์ด๋์ polls์์ ๋ชจ๋ธ๋ด์ Choice, Question์ ์ฌ์ฉํ๊ฒ ๋ค๋ผ๊ณ ์ถ๊ฐ๋ฅผ ํ๋ ์์
>>> Question.objects.all()
<QuerySet []>
- ํ์ฌ Question ๋ด์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ผ
>>> from django.utils import timezon
- Question ๋ชจ๋ธ์๋ ์ง๋ฌธ, ๋ฐํ์ผ์ด ์์๋ค.
- ๋ฐํ์ผ ์๊ฐ์ ์
๋ ฅํ๊ธฐ ์ํด์ timezone์ด๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ importํ๋ฉด ๋๋ค.
>>> q = Question(question_text="What's new?", pub_date=timezone.now())
>>> q.save()
>>> q.id
1
polls/models.py
from django.db import models
# Create your models here.
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = 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
- ๋ชจ๋ธ ๋ด์ ์์ฒ๋ผ
__str__
๋ฉ์๋๋ฅผ ์ถ๊ฐํด์ค๋ค.
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)
- ๊ฐ๋ฐ์์๊ฒ ํ์ํ ์ปค์คํ
๋ฉ์๋ ๋ํ ์ถ๊ฐํ ์ ์๋ค.
- ์์์ ์ถ๊ฐํ
__str__
์ ํฌํจํ ์ฝ๋๋ฅผ ์ง์ฐ์ง ๋ง๊ณ class Question์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
- ๊ฐ๋จํ๊ฒ ํจ์๋ฅผ ์ดํด๋ณด์
- timezone.now() : ํ์ฌ ์๊ฐ
- datetime.timedelta(days=1) : ํ๋ฃจ ์ ๋ ์ ์๊ฐ
- timezone.now() - datetime.timedelta(days=1)
- ํ์ฌ์๊ฐ์์ ํ๋ฃจ ์ ๋ ์ ์๊ฐ์ ๋นผ์ค๋ค.
- ํ์ฌ๋ก๋ถํฐ ํ๋ฃจ ์ฐจ๊ฐํ ์ด์ ์ ์๊ฐ ๋ฐํ
- return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
- ์ด์ ์ดํ๋ก ๋ฐํํ ๋ฐ์ดํฐ๊ฐ ๋ฆฌํด๋จ
๋ง์ ๋ชจ๋๋ค์ ๋ค ์ ์ ์์ผ๋ ๊ทธ ๋ ๊ทธ ๋ ์ฌ์ฉํ๋ฉด์ ์ตํ๋๊ฐ์
>>> Question.objects.all()
<QuerySet [<Question: What's new?>]>
- ์ ๋ชจ๋ธ์ ๋ณ๊ฒฝ์ฌํญ์ ์ ์ฅํ๊ณ shell์ ๋ค์ ์คํํ๋ฉด ๋ฌธ์๊ฐ ์ถ๋ ฅ๋๋ค.
django admin
- django์ ํธ๋ฆฌํ ๊ธฐ๋ฅ ์ค ํ๋๋ admin๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒ์ด๋ค.
- admin์ ์ฌ์ดํธ ๊ด๋ฆฌ๋ฅผ ์ํ ๊ด๋ฆฌ์ ์ ์ฉ ์ฌ์ดํธ์ด๋ค.
- html ํ์ด์ง๋ง ์กด์ฌํ๋ ์ฌ์ดํธ๊ฐ ์๋๊ณ ์๋ ๊ฑฐ์ ๋ชจ๋ ์น ์ดํ๋ฆฌ์ผ์ด์
์ admin์ด ์กด์ํ๋ค.
- ์ปจํ
์ธ ๋ฅผ ๊ด๋ฆฌํด์ผ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
- django๋ model, ์ฆ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ui๊ฐ ์กด์ฌํ๋ ํ๋ฉด์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ฒ๋ admin์ ๋ง๋ค์ด์ค๋ค.
$ python manage.py createsuperuser
- ๊ด๋ฆฌ์์ฌ์ดํธ์ ๋ก๊ทธ์ธ ํ ์ ์๋ ์ฌ์ฉ์๋ฅผ ๋ง๋ ๋ค.
$ python manage.py runserver
- ์ด์ admin ํ๋ฉด์์ ์ง๋ฌธ ์์ ๊ณผ ์ญ์ ๊ฐ ๊ฐ๋ฅํ๋ค.
<์ฐธ๊ณ >