๋ทฐ(view) ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ "๋ก์ง"์ ๋ฃ๋ ๊ณณ์ ๋๋ค.
์ฆ, View๋ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ธ (ํน์ ์ธ๋ถ)์์ ๊ฐ์ ธ์์ ์ ์ ํ ๊ฐ๊ณตํ์ฌ ์น ํ์ด์ง ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค๋๋ก ์ปจํธ๋กคํ๋ ์ญํ ์ ํ๋๊ฑฐ์ฃ !
๋ทฐ๋ ์ด๋ ค์๋ณด์ด์ง๋ง ์ฌ์ค ํ์ด์ฌ ํจ์์ผ ๋ฟ์ ๋๋ค. ๋ทฐ๋ค์ Django App์์ views.py ๋ผ๋ ํ์ผ์ ์ ์ํ๊ฒ ๋๋๋ฐ, ๊ฐ ํจ์๊ฐ ํ๋์ View๋ฅผ ์ ์ํฉ๋๋ค.
์ฐ๋ฆฌ๋ views๋ฅผ polls/views.py ํ์ผ ์์ ์ถ๊ฐํ๋๋ก ํ๊ฒ ์ต๋๋ค.
1. polls/view.py ์์ (๊ธฐ์กด ์ฝ๋์์ ๋ฐ์ ์ฝ๋ ์ถ๊ฐ)
- view๋ request๋ผ๋ ์ธ์๋ฅผ ๊ฐ๊ณ , HttpResponse()๋ผ๋ ๋ฆฌํด๊ฐ์ ๊ฐ์ง๋ค.
- ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ฌ๋ฌ๊ฐ์ง ์ ๋ณด๊ฐ ๋ด๊ธด request๋ฅผ ๋ฐ๊ณ , ํ๋์ ๋ง์น ํ HttpResponse() ์๋ต์ ๋ณด๋
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)
2. polls/urls.py์ path()ํจ์ ์ถ๊ฐ (ํด๋น ์ฝ๋๋ก ์์ )
- ์๋ก์ด ๋ทฐ๋ฅผ polls.urls ๋ชจ๋๋ก ์ฐ๊ฒฐ
- ์ง๋ฌธ “์์ธ” ํ์ด์ง – ์ต๊ทผ ์ง๋ฌธ๋ค ํ์
- ์ง๋ฌธ “์ธ๋ถ” ํ์ด์ง – ์ง๋ฌธ ๋ด์ฉ๊ณผ ํฌํํ ์ ์๋ ์์์ ํ์
- ์ง๋ฌธ “๊ฒฐ๊ณผ” ํ์ด์ง – ํน์ ์ง๋ฌธ์ ๋ํ ๊ฒฐ๊ณผ ํ์
- ํฌํ ๊ธฐ๋ฅ – ํน์ ์ง๋ฌธ์ ๋ํด ํน์ ์ ํ์ ํ ์ ์๋ ํฌํ ๊ธฐ๋ฅ ์ ๊ณต
from django.urls import path
from . import views
urlpatterns = [
# ex: /polls/
path('', views.index, name='index'),
# ex: /polls/5/
path('<int:question_id>/', views.detail, name='detail'),
# ex: /polls/5/results/
path('<int:question_id>/results/', views.results, name='results'),
# ex: /polls/5/vote/
path('<int:question_id>/vote/', views.vote, name='vote'),
]
3. polls/urls.py์์ HttpResponse()์์ ์ง์ ๋ ๋ฌธ์์ด์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ์ฌ ๋ฆฌํดํ๋๋ก ์์
- question ๋ฐ์ดํฐ์์ ์ต๋ 5๊ฐ๊น์ง([:5])์ ๋ฐ์ดํฐ๋ฅผ ์ถํ ์ผ์(pub_date)๋ฅผ ์ ๋ ฌํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ latest_question_list์ ๋ฃ๋๋ค.
- ์ด 5๊ฐ์ ๋ฐ์ดํฐ๊ฐ ๋ด๊ฒจ์๋ latest_qustion_list๋ฅผ ',' ๋ก ์ฐ๊ฒฐํ์ฌ ๋ฌธ์์ด๋ก ๋ง๋ค๊ณ ๋ ๋ค output ๊ฐ์ ๋ฃ์ด์ค๋ค.
- output๊ฐ์ HttpResponse๋ก ๋ฆฌํดํด์ค๋ค.
from django.http import HttpResponse
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
output = ', '.join([q.question_text for q in latest_question_list])
return HttpResponse(output)
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)
4. ์๋ฒ ์ฐ๊ฒฐ ํ 3์ ๊ณผ์ ์ด ์ ๋๋ก ์ด๋ฃจ์ด์ก๋์ง ํ์ธ
- py manage.py runserver ํ์ฌ ์๋ฒ ์ฐ๊ฒฐํด์ฃผ๊ธฐ
- ํ์ฌ ์ง๋ฌธ์ด 1๊ฐ๋ฐ์ ์๊ธฐ ๋๋ฌธ์ ํ๋์ ์ง๋ฌธ๋ง ์ถ๋ ฅ๋จ
PS C:\Users\bythu\Desktop\SWLUG\Django\mysite> py manage.py runserver
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
April 04, 2023 - 06:20:51
Django version 4.1.7, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
[04/Apr/2023 06:21:16] "GET /polls/ HTTP/1.1" 200 11
ํ์ง๋ง, ์ด๋ ๊ฒ ๋๋ฉด ํ์ด์ง์ ๋์์ธ ์์ ์ด ์ด๋ ค์์ง๋ค.
๋์์ธ์ ์์ ์ ์ํด์๋ ์ ์๋ ํ์ด์ฌ ํจ์ ๋ด๋ถ๋ฅผ ์์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋์ ๋ด๋ถ '๋ก์ง' ๋ด๋น์ธ <๋ทฐ>์ ๋์์ธ ๋ด๋น์ <ํ ํ๋ฆฟ>์ ๊ตฌ๋ถํด์ฃผ์ด์ผ ํ๋ค.
1. ํ ํ๋ฆฟ ๋๋ ํ ๋ฆฌ ์์ฑ
- polls/templates/polls/index.html ์์ฑ
- polls ์ฐํด๋ฆญ ํ New Folder ํด๋ฆญ: templates
- templates ์ฐํด๋ฆญ ํ New Folder ํด๋ฆญ: polls
- polls ์ฐํด๋ฆญ ํ New File ํด๋ฆญ: index.html
* ์ฃผ์ํด์ผํ ์
ํ ํ๋ฆฟ ๋๋ ํ ๋ฆฌ ์์ ์ฑ(๊ธฐ๋ฅ)์ ์ด๋ฆ์ผ๋ก ๋๋ ํ ๋ฆฌ๋ฅผ ํ๋ ๋ ๋ง๋ค์ด html ํ์ผ(๋์์ธ)์ ๊ด๋ฆฌํ๋ค.
๋ง์ฝ, ์ด๋ฌํ ๊ตฌ๋ถ์ด ์์ด ๋๋ ํ ๋ฆฌ ์์ ๋ฐ๋ก html ํ์ผ์ ๋ง๋ค ๊ฒฝ์ฐ, ์ฅ๊ณ ๋ ๋ค๋ฅธ ์ฑ์ ํ ํ๋ฆฟ๊ณผ ํผ๋ํ ์ ์๋ค.
๋ฐ๋ผ์, ๋ง์ฝ์ ํ์ด์ง๋ฅผ ๋์์ธํ๋ ํ ํ๋ฆฟ์ ๋ง๋ค๊ณ ์ ํ๋ค๋ฉด 1. ํ ํ๋ฆฟ ๋๋ ํ ๋ฆฌ ์์ฑ์์ ์ฐ๋ฆฌ๊ฐ ํ ๊ฒ ์ฒ๋ผ
- ๋๋ ํ ๋ฆฌ ๋ด์ ์ฑ ์ด๋ฆ์ ๋๋ ํ ๋ฆฌ ์์ฑ
- ์ฑ ์ด๋ฆ์ ๋๋ ํ ๋ฆฌ ๋ด์ html ํ์ผ ์์ฑ
์ ์์๋ฅผ ๋ฌด์กฐ๊ฑด ๊ฑฐ์ณ์ผ ํ๋ค.
2. index.html ์์ฑ
* ๊ฒฝ๋ก ํ์ธํด์ฃผ์ธ์! ํ ํ๋ฆฟ ๋๋ ํ ๋ฆฌ/ polls ๋๋ ํ ๋ฆฌ/index.html ํ์ผ์ด์ฌ์ผ ํฉ๋๋ค
- html ์ฝ๋
- <ul> ํ๊ทธ๋ฅผ ํตํด latest_question_list์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํด์ค๋ค
- question.id๋ฅผ ๋ฃ์ ๋งํฌ๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋๋ก ํ๋ค.
{% if latest_question_list %}
<ul>
{% for question in latest_question_list %}
<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
3. polls/view.py ์ ํ ํ๋ฆฟ์ด ์ ์ฉ๋๋๋ก index ๋ทฐ ์์
- context๋ฅผ ํตํด ํ ํ๋ฆฟ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ค๋ค.
- ํ ํ๋ฆฟ์ด ๋ฐ์ดํฐ ์ฌ์ฉํ๋ค.
- template = loader.get_template('polls/index.html')
from django.http import HttpResponse
from django.template import loader
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
template = loader.get_template('polls/index.html')
context = {
'latest_question_list': latest_question_list,
}
return HttpResponse(template.render(context, request))
4. ์ ๋๋ก ์์ ์ด ๋์๋์ง ํ์ธ
- ๊ฐ๋ฐ์๋๊ตฌ(f12)๋ฅผ ํตํด question.id๊ฐ ์ ๋๋ก ์ ๋ฌ์ด ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
+) render()๋ฅผ ํตํด ํ ํ๋ฆฟ ์ฐ๊ฒฐ์ ์ํ ์ฝ๋๋ฅผ ๋จ์ํ๊ฒ ๋ง๋ค๊ธฐ
render() ํจ์๋ request ๊ฐ์ฒด๋ฅผ ์ฒซ๋ฒ์งธ ์ธ์๋ก ๋ฐ๊ณ , ํ ํ๋ฆฟ ์ด๋ฆ์ ๋๋ฒ์งธ ์ธ์๋ก ๋ฐ์ผ๋ฉฐ, context ์ฌ์ ํ ๊ฐ์ฒด๋ฅผ ์ธ์ ์งธ ์ ํ์ (optional) ์ธ์๋ก ๋ฐ๋๋ค. ์ธ์๋ก ์ง์ ๋ context๋ก ํํ๋ ํ ํ๋ฆฟ์ HttpResponse ๊ฐ์ฒด๊ฐ ๋ฐํ๋๋ค.
from django.http import HttpResponse
from .models import Question
from django.shortcuts import render
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
context = {'latest_question_list': latest_question_list}
return render(request, 'polls/index.html', context)
๋ชจ๋ ๋ทฐ์ ์ ์ฉํ๋ค๋ฉด, ๋ ์ด์ loader์ HttpResponse๋ฅผ ์ํฌํธํ์ง ์์๋ ๋๋ค.
-> ํ์ง๋ง ์ค์ ๋ก ์ ์ฉํด๋ณด๋ฉด, ์ ํฌ๋ ๋ชจ๋ ๋ทฐ์ ์ ์ฉํ์ง ์์๊ธฐ ๋๋ฌธ์ ๋ฐ์ ์ค๋ฅ๊ฐ ๋น๋๋ค.
๋ฐ๋ผ์ HttpResponse๋ importํด์ฃผ์ด์ผ ํด์!
name 'HttpResponse' is not defined
* ์ฐธ๊ณ ๋ก ์ฅ๊ณ ๋ reloading์ด๋ผ๋ ๊ธฐ๋ฅ์ ํตํด ๋ณ๊ฒฝ๋๋ ๋ด์ฉ์ ๊ฐ์งํ๋ฉด ์๋์ผ๋ก reloading๋์ด ๋ฐ์๋จ
- URL์ ์๋ก๊ณ ์นจํ์ฌ ์ ๋๋ก ๋์ํ๋์ง ํ์ธ
5. ์๋ฌ ์ฒ๋ฆฌ ํ๊ธฐ (๋ทฐ ์์ )
- question์ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ ์๋ฌ๊ฐ ๋ฐ์ํ๋๋ฐ, ์ด๋ด๋๋ง๋ค ์๋ฌ๋ฅผ ๋ฐ์์ํค๋ฉด ์๋๋ค.
๋ฐ๋ผ์, ์๋ฌ ํ์ด์ง๋ฅผ ์ฒ๋ฆฌํด์ค ๊ฒ์ด๋ค.
- ๋ฐ์ดํฐ๊ฐ ์์ ๋ ์๋ฌ ํ์ด์ง ๋์ "Question does not exist"๊ฐ ์ถ๋ ฅ๋๋๋ก detail์ ์์ ํด์ค๋ค.
from django.http import HttpResponse, Http404
...
def detail(request, question_id):
try:
question = Question.objects.get(pk=question_id)
except Question.DoesNotExist:
raise Http404("Question does not exist")
return render(request, 'polls/detail.html', {'question': question})
6. ์๋ฌ ์ฒ๋ฆฌ ํ๊ธฐ (ํ ํ๋ฆฟ ์์ )
1. polls/templates ๋๋ ํ ๋ฆฌ์ detail.html ์ถ๊ฐ
2. detail.html ์ฝ๋ ์์ฑ
{{ question }}
6. ์ ๋๋ก ์์ ๋์๋์ง ํ์ธ
- ์๋ question.id๋ฅผ ์กฐํํ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ์๋ฌ๊ฐ ์ฒ๋ฆฌ๋๋์ง ํ์ธํด๋ณผ ๊ฒ์ด๋ค.
http://127.0.0.1:8000/polls/5/
-> ๋ฐ์ดํฐ๊ฐ ์ง๊ธ 1๊ฐ์ด๋ฏ๋ก 5๋ฒ์งธ ๋ฐ์ดํฐ๋ ์๋ค. ๋ฐ๋ผ์ URL์ 5๋ฅผ ๋ฃ์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ๋๋์ง ํ์ธํด๋ณด๋ ๊ฒ์ด๋ค.
+) get_object_or_404()๋ฅผ ํตํด ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ฝ๋ ๋จ์ํ๊ฒ ๋ง๋ค๊ธฐ
get_object_or_404() ํจ์๋ Django ๋ชจ๋ธ์ ์ฒซ๋ฒ์งธ ์ธ์๋ก ๋ฐ๊ณ , ๋ช๊ฐ์ ํค์๋ ์ธ์๋ฅผ ๋ชจ๋ธ ๊ด๋ฆฌ์์ get() ํจ์์ ๋๊น๋๋ค. ๋ง์ฝ ๊ฐ์ฒด๊ฐ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ, Http404 ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
from django.shortcuts import get_object_or_404, render
from .models import Question
# ...
def detail(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'polls/detail.html', {'question': question})
- ์๋ก๊ณ ์นจํ์ฌ ์ ๋๋ก ์๋์ด ๋๋์ง ํ์ธํ๋ค.
๋ค์์ผ๋ก๋ ๋ค์ ๋์์ detail () ๋ทฐ์ ํ ํ๋ฆฟ์ ์์ ํ์ฌ question์ ํด๋ฆญํ๋ฉด ๋ณด์ด๋ detail() ๋ทฐ์ ๋์์ธ์ ๊พธ๋ฉฐ๋ณด๊ฒ ์ต๋๋ค.
1. detail() ๋ทฐ์ ํ ํ๋ฆฟ ์์
- <h1> ํ๊ทธ๋ฅผ ํตํด question์ ๋ณด์ฌ์ฃผ๊ณ , ์ ํ์ง๋ฅผ ๋ฆฌ์คํธ ํ๊ทธ๋ฅผ ์ฌ์ฉํด ๋ณด์ฌ์ฃผ๋ ์ฝ๋์ด๋ค.
<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
<li>{{ choice.choice_text }}</li>
{% endfor %}
</ul>
- ์์ html์ฝ๋๋ question(ex. "What's new?)์ ForeignKey๋ก ๊ฐ๋ ๋ชจ๋ choice๋ค์ ๋ณด์ฌ์ฃผ๊ณ ์ ํ๋ ์ฝ๋์ด๋ค.
2. ์ ๋๋ก ์์ ๋์๋์ง ํ์ธ
URL ์๋ก๊ณ ์นจํ ๋ค, ํด๋ฆญํด๋ณด๋ฉด ์์ ๋ ๋์์ธ์ด ๋ณด์ด๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
- ํ์ง๋ง, ์ ํ์ง๊ฐ ๋ณด์ด์ง ์๋๋ค. ํ์ฌ ์ ํ์ง ๋ฐ์ดํฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
3. ์ ํ์ง ๋ฐ์ดํฐ ์ถ๊ฐํด์ฃผ๊ธฐ
- admin์ผ๋ก ๋ค์ด๊ฐ ์ ํ์ง ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํด์ฃผ๋๋ก ํ๋ค.
(1) polls/admin.py ์์ ํ ์ ์ฅ
from django.contrib import admin
# Register your models here.
from .models import Question, Choice
admin.site.register(Question)
admin.site.register(Choice)
(2) http://127.0.0.1:8000/admin/ ์ ์ ํ ์ ํ์ง ์ถ๊ฐ
- Ubuntu
- MS
- SWLUG
4. ํ์ธ
- ์ ํ์ง๊ฐ ์ ๋๋ก ์ถ๊ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
- "What's new?"๊ฐ ๊ฐ๋ ๋ชจ๋ ์ ํ์ง๊ฐ ๋ณด์ด๊ฒ ๋๋ค.
ํ์ง๋ง ์ฌ๊ธฐ์, index.html๋ฅผ ํ์ธํด๋ณด๋ฉด url ๋ถ๋ถ("/polls/{{ question.id }}/")์ด ํ๋์ฝ๋ฉ๋์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
* ํ๋์ฝ๋ฉ์ด๋: ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ๋ด๋ถ์ ์ง์ ์ ๋ ฅํ๋ ๊ฒ
์ด๋ด ๊ฒฝ์ฐ url์ด ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ์ ์ฝ๊ฒ ์์ ํ์ง ๋ชปํ๊ฒ ๋๋ค.
์ฅ๊ณ ์์๋ url๋ง๋ค ์ด๋ฆ(name)์ ์ง์ ํ ์ ์๊ฒ ํด์ค๋ค. ๋ฐ๋ผ์, url ์ฝ๋์ name์ ๋ช ์ํ์ฌ ํ ํ๋ฆฟ์ ๊ทธ name์ ์ง์ ์จ์ฃผ๊ฒ ๋๋ฉด ์์ ์ ์ฉ์ดํ๊ฒ ํ ์ ์๋ค. ์ด name์ url ๋ณ์นญ์ด๋ผ๊ณ ํ๋ค.
// C์ธ์ด ๋ฑ์์ ๊ฐ์ ๋ฃ์ด์ฃผ๋๊ฒ ์๋๋ผ ๊ฐ ๋์ ์ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋น์ทํ ๊ฐ๋ ์ด๋ค.
์ฌ์ค ์ด๋ฏธ ์ด ์ด๋ฆ์ ์ง์ ํ์๋ค.
urls.py์ path()ํจ์์์ ๋ณด์ด๋ ๋ฐ๋ก ์ด name ๊ฐ์ด๋ค.
1. urls.py ์์
- ๋ค๋ฅธ ์ฑ์์๋ detail์ ๋ํ url ๋ค์์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก, ํด๋น ์ฑ์์ ์ฌ์ฉํ๋ url์ ๋ํด์๋ namespace๋ฅผ ๋ช ์ํ์ฌ ์ค์ ํด์ค๋ค.
app_name = 'polls'
2. index.html ์์
- ์ฝ๋๋ฅผ ์์ ํ์ฌ url ๋ค์์คํ์ด์ค๋ฅผ ๋ช ์ํด์ค๋ค.
<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>