Model
template์ด ์ฌ์ฉ์๊ฐ ๋ณด๋ ํ๋ฉด์ ๊ตฌ์ฑํ๋ค๋ฉด model์ ๊ทธ ํ๋ฉด ๊ตฌ์ฑ์ ์ฑ์ฐ๋ ๋ด์ฉ๋ฌผ์ด๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค(DB)๋ผ๋ ๊ฒ์ด ์ด model์ ์๋ฏธํ๋ค.
์ฐ๋ฆฌ๊ฐ ํน์ ์ฌ์ดํธ์ ํ์๊ฐ์
์ ํ๊ฑฐ๋, ๊ธ์ ์ฐ๊ฒ๋๋ฉด ๊ทธ ์ ๋ณด๋ ์๋ฒ์ปดํจํฐ์ DB์ ์ ์ฅ์ด ๋๊ณ , ์ด DB์ ์ ์ฅ๋ ๋ด์ฉ์ ์ฌ์ฉ์์ ์์ฒญ์ ๋ฐ๋ผ view๋ฅผ ํตํด ๊ฐ๊ณต๋์ด template์ ๋ณด์ฌ์ง๊ฒ ๋๋ค.
(๋ฐ์ดํฐ๋ฅผ ์์๋๊ณ ์๋ค๊ฐ ํ์ํ ๋ ๊บผ๋ด์ฃผ๋ ๊ณณ์ด๋ค.)
์ถํ ๋ง๋ค ๋ธ๋ก๊ทธ ํ์ด์ง๋ฅผ ์ํด ์๋ก์ด ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด๋ณด์.
project ์์ํ๊ธฐ
django-admin startproject secondproject
Bash
๋ณต์ฌ
python manage.py startapp blog
Bash
๋ณต์ฌ
model ๋ง๋ค๊ธฐ
model์ ์ผ์ข
์ ์์
ํ์ ๋น์ทํ๋ค. ๋ธ๋ก๊ทธ ๊ฒ์๊ธ์ ์ฌ๋ฆฌ๊ธฐ ์ํด ํ์ํ ๋ด์ฉ์ด ๋ญ๊ฐ ์์๊น ์๊ฐํด๋ณด์. ์ฌ๋ฌ๊ฐ ๋ค์ด๊ฐ๋ฉด ์ ์ ์์ผ๋ ์๋ 3๊ฐ๋ง ๋ฃ์ด์ model์ ๋ง๋ค์ด๋ณธ๋ค.
โข
์ ๋ชฉ
โข
๋ณธ๋ฌธ
โข
์์ฑ์ผ์
blog์ ๊ด๋ จ๋ model์ ์์ฑํ๋ ๊ฑฐ๋๊น blog ํด๋ ๋ด์ model์ ์ฐ๋ค.
class ๋ช
์ ์ง์๋์๋ ๊ผญ ์ฒซ๊ธ์๋ฅผ ๋๋ฌธ์๋ก ์ง์ด์ผํ๋ค. ์ด๊ฑด ๊ฐ๋ฐ์ ๊ฐ์ ์ฝ์(?) ๊ฐ์ ๊ฑฐ๋ค.
class Blog(models.Model):
title = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
body = models.TextField()
Python
๋ณต์ฌ
title,pub_date,body๋ ๋ชจ๋ธ์ ์์ฑ๋ค์ด๋ค.
์์ฑ์ ์ฐ๋ฆฌ๊ฐ ๊ฒ์๊ธ์ ์ฌ๋ฆฌ๊ธฐ ์ํด ํ์ํ ๋ด์ฉ๋ค์ ์๋ฏธํ๋ฉฐ, ์ฐ๋ฆฌ๋ ์ด ํ์ํ ๋ด์ฉ๋ค์ด ์ด๋ค ๋ชจ์์ผ๋ก ํ์ฑ๋ ์ง ์๋ ค์ค์ผํ๋ค.
1.
title ์์ฑ์ ์ต๋ length๊ฐ 200์ธ ๋ฌธ์์ด๋ก ํ์ฑํ ๊ฑฐ์ผ.
2.
pub_date ์์ฑ์ ๋ ์ง์ ์๊ฐ์ผ๋ก ํ์ฑํ ๊ฑฐ์ผ.
3.
body ์์ฑ์ ๊ธด ๋ฌธ์์ด์ผ๋ก ํ์ฑํ ๊ฑฐ์ผ.
์์ ๊ฐ์ด model์ ์์ฑํ์ผ๋ฉด ์ด์ python manage.py๋ก ์ถ๊ฐ์ ์ธ ๋ช
๋ น์ ๋ด๋ ค์ค์ผ ํ๋ค. ์ด๊ฑด ๊ธฐ์ตํ๊ณ ๊ฐ์. model์ ๋ง๋ค๊ณ ์ถ๋ค๋ฉดโฆ
1.
models.py์์ ์ฝ๋ ์์ฑ
2.
python manage.py makemigrations ์ ํตํด migration ๋ง๋ค๊ธฐ
3.
python manage.py migrate ์ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฉํ๊ธฐ
model์ ๋ง๋ค๋ ค๋ฉด ์์ 3๊ฐ์ง ์์
์ ๊ผญ ํด์ผํ๋ค.
์ด์ 2, 3 ๋ฒ ์์
์ ํด๋ณด์.
python manage.py makemigrations
Bash
๋ณต์ฌ
migration์ ๋ง๋๋ ๋ช
๋ น์ด.
migration์ด๋?
python manage.py migrate
Bash
๋ณต์ฌ
์์ฑํ ๋ชจ๋ธ์ DB์ ์ ์ฉ์ํค๋ ๋ช
๋ น์ด.
์ด๋ผ ์ด์ฐ์ ์ฐ model์ด ๋ง๋ค์ด์ง๋ค.
์ด์ ์ ๋ง๋ค์ด์ก๋์ง ํ์ธ์ ํด์ผํ๋ค. ๋ฐ๋ก ๊ฒ์๊ธ์ ์ง์ ๋ฑ๋กํด๋ณด๋ ๊ฒ. ์ด๋ด๋ ์ ์ฉํ๊ฒ ์ธ ์ ์๋ ์ฌ์ดํธ๊ฐ ์๋ค. ๋ฐ๋ก adminํ์ด์ง์ด๋ค.
admin ํ์ด์ง
admin ํ์ด์ง๋ ์ฌ์ดํธ ๊ด๋ฆฌ์๊ฐ ์ปจํ
์ธ ๋ฅผ ํธ์งํ ์ ์๋ ํตํฉ์ ์ธ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค. ๋ฌผ๋ก ์ฌ์ฉ ๋ชฉ์ ์ ๋ฐ๋ผ ์์ ํด์ผํ ์ผ์ด ๋ค๋ถํ์ง๋ง, ์ ๊ณตํด์ฃผ๋ ๊ฒ์ด ์ด๋์ธ๊ฐ.
127.0.0.1/admin ์ผ๋ก ์ ์ํ๋ฉด ์๋์ ๊ฐ์ด ๋ฌ๋ค.
๋ก๊ทธ์ธ์ ํด์ผํ๋๋ฐ ๋ก๊ทธ์ธ ํ ๋ฐฉ๋ฒ์ด ์๋ค. ์์ด๋๋ ๋น๋ฒ๊ฐ์๊ฑธ ๋ง๋ ์ ์ด ์๊ธฐ ๋๋ฌธ. ์์ด๋๋ฅผ ๋ง๋ค์ด ์ ์์ ํด๋ณด์.
admin ๋ง๋ค๊ธฐ
python manage.py createsuperuser
Bash
๋ณต์ฌ
admin์ ๋ง๋๋ ๋ช
๋ น์ createsuperuser์ด๋ค. ์ํผ์ ์ ๋ฅผ ๋ง๋ค๋ผ๊ณ ๋ช
๋ น์ ๋ด๋ฆฌ๋ฉด ์์ด๋์ ์ด๋ฉ์ผ์ฃผ์, ๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํ๋ผ๋ ๋ด์ฉ์ด ํฐ๋ฏธ๋์ ๋์จ๋ค.
์์ฑ ํ ๋ง๋ค์ด์ง ๊ณ์ ์ ๊ฐ์ง๊ณ ์นํ์ด์ง๋ก ๋์๊ฐ ๋ก๊ทธ์ธ ํด๋ณด์.
์๊น ๋ง๋ model์ ํ์ธํ๋ ค๊ณ adminํ์ด์ง์ ๋ค์ด์๋๋ฐ.. blog๊ฐ ๋ณด์ด์ง ์๋๋ค. ์๋ํ๋ฉด django์๊ฒ๋ ์ฐ๋ฆฌ๊ฐ model์ ๋ง๋ค์๋ค๋ ๊ฑธ migrate๋ฅผ ํตํด ์๋ ธ์ง๋ง, admin์๊ฒ๋ ์๋ ค์ฃผ์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค.
admin์ model ๋ฑ๋กํ๊ธฐ
blog ํด๋ ์์ผ๋ก ๋ค์ด๊ฐ๋ฉด admin.py๋ผ๋ ํ์ผ์ด ์๋ค. ์์ ๋ ์ค์ ์ถ๊ฐํด์ค๋ค.
from .models import Blog
# Register your models here.
admin.site.register(Blog)
Python
๋ณต์ฌ
์ฒซ์งธ์ค์ ๊ฐ์ ํด๋์์น์ ์๋ models ๋ผ๋ ํ์ผ์, Blog ๋ผ๋ ํด๋์ค๋ฅผ ๊ฐ์ ธ์ค๋ผ๋ ์๋ฆฌ๊ณ , ๋งจ ๋ฐ์ ์ค์ admin์ด๋ผ๋ site์ Blog ๋ผ๋ ํด๋์ค๋ฅผ ๋ฑ๋กํ๋ผ๋ ๋ง์ด๋ค.
์ด๋ฌ๊ณ ์๋ก ๊ณ ์นจ์ ํด๋ณด๋ฉด,
๋ธ๋ก๊ทธ๊ฐ ์๊ธด๋ค.
add Blog ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ค์์ ๊ฐ์ ๊ฒ์๊ธ ์
๋ ฅ ํ๋ฉด์ด ๋ฌ๋ค. title, Date publiched, body๋ผ๋ ์๊น ์ง์ ์์ฑํ๋ ๋ด์ฉ๋ค์ด๋ค.
models.py์ ์ ์๋ ๋ด์ฉ๋ค์ด admin ํ์ด์ง์์ add blog ํ์ด์ง์ ์์์ ๊ฒฐ์ ํ๋ ๊ฒ์ด๋ค.
blog ๋ชจ๋ธ์ ๊ธ ์์ฑํด๋ณด๊ธฐ
์ฒซ ๊ธ์ ์์ฑํด๋ณด์๋ค.
๊ธ ์ ๋ชฉ ํ์ํ๊ธฐ
ํด๋น ๊ธ ๋ชฉ๋ก์์ Blog object (1)์ด ์๋ ๊ธ ์ ๋ชฉ์ ํ์ํ๊ณ ์ถ๋ค.
class Blog(models.Model):
title = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
body = models.TextField()
def __str__(self):
return self.title
Python
๋ณต์ฌ
โ__str__โํจ์๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๊ธ ์ ๋ชฉ์ด ํ์๋๋ค.
์ฟผ๋ฆฌ์ ๊ณผ ๋ฉ์๋
view๋ก ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
model์ ์ง์ ๋ง๋ค๊ณ admin ํ์ด์ง์์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ๋ฑ๋กํ๋ค. ๊ทธ๋ผ ์ด์ ์ด ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ค์ผํ๋ค.
from django.shortcuts import render
from .models import Blog
# Create your views here.
def home(request):
blogs = Blog.objects # ์ฟผ๋ฆฌ์
# ๋ฉ์๋
return render(request, 'home.html', {'blogs': blogs})
Python
๋ณต์ฌ
๋จผ์ Blog๋ฅผ import ํด์ฃผ๊ณ , Blog.objects๋ฅผ blogs ๋ผ๋ ๋ณ์์๋ค๊ฐ ๋ฃ์ด์ค๋ค.
Blog.objects๋ ์๊น admin ํ์ด์ง์์ ํ์ธํ๋ blog ์์ ๋ฐ์ดํฐ๋ค์ด๋ค. ์ด๋ ๊ฒ ๋ชจ๋ธ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ๊ฐ์ฒด๋ชฉ๋ก์ ์ฐ๋ฆฌ๋ queryset์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ์ฟผ๋ฆฌ์
๋ค์ ์ฒ๋ฆฌํด์ฃผ๋ ๋ฐฉ๋ฒ์ ๋ฉ์๋๋ผ๊ณ ๋ถ๋ฅธ๋ค.
render์์๋ ์ฌ์ ํ ์๋ฃํ์ธ {'blogs': blogs} ๋ฅผ ์ถ๊ฐํ๋๋ฐ, blogs๋ผ๋ ๋ณ์๋ฅผ template์์ ์ธ๋ blogs๋ผ๋ ์ด๋ฆ์ผ๋ก ๊ฐ์ ธ์ค๊ฒ ๋ค๊ณ ๋ช
๋ช
ํ๋ ์์
์ด๋ค.
์ด์ temlplate์ blog ๋ชจ๋ธ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐํด๋ณด์. view์์ ๋์ด์จ ๋ฐ์ดํฐ๋ฅผ template์์ ๋ณด์ฌ์ฃผ๋ ค๋ฉด..?
์ง๋๋ฒ ๋ฐฐ์ด{{ }}๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
์ผ๋จ {{ blogs }}๋ฅผ ์ ์ด๋ณด์.
์ด๋ฐ ํ์ด์ง๊ฐ ๋์จ๋ค. ๋ญ๊ฐ ์ฐ๊ฒฐ๋ ๊ฒ ๊ฐ๊ธด ํ๋ค.
์ด๋ฒ์ {{ blogs.all }}์ ์ ์ด๋ณด์.
์ด๋ฐ ํ์ด์ง๊ฐ ๋์จ๋ค. ๋ด๊ฐ ์จ๋์ ๊ธ์ ์ ๋ชฉ ๋ชฉ๋ก๋ค์ด ๋ชจ๋ ์ถ๋ ฅ๋์๋ค.
template์์ ๊ฐ์ ธ์จ blogs๋ list ํ์์ผ๋ก ๋์ด์จ๋ค. ๊ทธ๋ ๊ฒ ๋์ด์จ ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ฆฌ๊ฐ ์๋ง๊ฒ ์๋ผ์ template์ ํ์ํ ๋ถ๋ถ๋ถ๋ถ์ ๋ฟ๋ ค์ฃผ๋ฉด ๋๋ค.
Blog์ title๊ณผ body, pub_date๋ฅผ template์ ๋ฐฐ์นํด๋ณด์.
{% for blog in blogs.all %}
<h1> {{blog.title}} </h1>
<p> {{blog.pub_date}} </p>
<p> {{blog.body}} </p>
<br><br>
{% endfor %}
HTML
๋ณต์ฌ
html์ ์์ ๋ด์ฉ์ ์์ฑํด์ฃผ๊ณ ์๋ก๊ณ ์นจ์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ํ์ด์ง๊ฐ ๋์จ๋ค. ๊ธ์ ์ถ๊ฐ์ ์ผ๋ก ์์ฑํ๋ฉด ์๋์ ์๋ก์ด ๊ธ์ด ๊ณ์ ์ถ๊ฐ๋๋ค.
๊ธ์ ๋ช ๊ฐ ๋ ์จ๋ณด๋ฉด,
๋น์ฐํ๊ฒ๋ ์ ๋์จ๋ค.
model์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ๊ทธ๊ฑธ view๋ฅผ ํตํด template์ ๋ณด์ฌ์ฃผ๋ ์์
๊น์ง ํด๋๋ค.
์ฒ์ html ํ์ผ์ ํ
ํ๋ฆฟ ๋ณ์๋ก์จ ์์ฑํ๋ {{ blogs }}๋ ๋ฆฌ์คํธ ํ์์ ์ฟผ๋ฆฌ์
๊ฐ์ฒด์ด๋ค.
์ฐ๋ฆฌ๋ ์ด ๊ฐ์ฒด๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ์ง ์๊ณ , {{ blogs.all() }} ๊ตฌ๋ฌธ์ ์ฌ์ฉํด ๊ฐ์ฒด์ ์๋ ๋ชจ๋ ์ฟผ๋ฆฌ์
์ ๊ฐ์ ธ์ ์ถ๋ ฅํ๋ค. ์ด์ฒ๋ผ ๊ฐ์ฒด๋ฅผ ์ถ๋ ฅํ๊ฑฐ๋ ์ด์ฉํ ๋ ํ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ฉ์๋๋ผ๊ณ ํ๋ค.
๊ฐ์ฒด.count(), ๊ฐ์ฒด.first(), ๊ฐ์ฒด.last() ๋ฑ ๋ค์ํ ๋ฉ์๋๊ฐ ์์ผ๋, ๋ค์ํ ๋ฉ์๋๋ฅผ ๊ตฌ๊ธ๋งํด๋ณด๋ ๊ฒ์ ์ถ์ฒํ๋ค.