Study

[3์ฃผ์ฐจ] Django View ์‹ค์Šต

mnzy๐ŸŒฑ 2023. 4. 5. 03:32
๋ทฐ(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)

์ž‘์„ฑํ•œ ๋’ค ctrl+s

 

 

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'),
]

์ž‘์„ฑํ•œ ๋’ค ctrl+s

 

 

 

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 ์ƒ์„ฑ 

  1. polls ์šฐํด๋ฆญ ํ›„ New Folder ํด๋ฆญ: templates
  2. templates ์šฐํด๋ฆญ ํ›„ New Folder ํด๋ฆญ: polls 
  3.  polls ์šฐํด๋ฆญ ํ›„ New File ํด๋ฆญ: index.html

* ์ฃผ์˜ํ•ด์•ผํ•  ์ 

ํ…œํ”Œ๋ฆฟ ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— ์•ฑ(๊ธฐ๋Šฅ)์˜ ์ด๋ฆ„์œผ๋กœ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํ•˜๋‚˜ ๋” ๋งŒ๋“ค์–ด html ํŒŒ์ผ(๋””์ž์ธ)์„ ๊ด€๋ฆฌํ•œ๋‹ค. 

๋งŒ์•ฝ, ์ด๋Ÿฌํ•œ ๊ตฌ๋ถ„์ด ์—†์ด ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— ๋ฐ”๋กœ html ํŒŒ์ผ์„ ๋งŒ๋“ค ๊ฒฝ์šฐ, ์žฅ๊ณ ๋Š” ๋‹ค๋ฅธ ์•ฑ์˜ ํ…œํ”Œ๋ฆฟ๊ณผ ํ˜ผ๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. 

๋”ฐ๋ผ์„œ, ๋งŒ์•ฝ์— ํŽ˜์ด์ง€๋ฅผ ๋””์ž์ธํ•˜๋Š” ํ…œํ”Œ๋ฆฟ์„ ๋งŒ๋“ค๊ณ ์ž ํ•œ๋‹ค๋ฉด 1. ํ…œํ”Œ๋ฆฟ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ํ•œ ๊ฒƒ ์ฒ˜๋Ÿผ

  1. ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์— ์•ฑ ์ด๋ฆ„์˜ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
  2. ์•ฑ ์ด๋ฆ„์˜ ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์— 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 %}

์ž‘์„ฑํ•œ ๋’ค ctrl+s

 

 

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))

์ž‘์„ฑํ•œ ๋’ค ctrl+s

 

 

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)

์ž‘์„ฑํ•œ ๋’ค ctrl+s

 

๋ชจ๋“  ๋ทฐ์— ์ ์šฉํ•œ๋‹ค๋ฉด, ๋” ์ด์ƒ 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 }}

์ž‘์„ฑํ•œ ๋’ค ctrl+s

 

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})

์ž‘์„ฑํ•œ ๋’ค ctrl+s

 

 

- ์ƒˆ๋กœ๊ณ ์นจํ•˜์—ฌ ์ œ๋Œ€๋กœ ์ž‘๋™์ด ๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

 

 


๋‹ค์Œ์œผ๋กœ๋Š” ๋‹ค์‹œ ๋Œ์•„์™€ 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>

์ž‘์„ฑํ•œ ๋’ค ctrl+s

 

 

- ์œ„์˜ html์ฝ”๋“œ๋Š” question(ex. "What's new?)์„ ForeignKey๋กœ ๊ฐ–๋Š” ๋ชจ๋“  choice๋“ค์„ ๋ณด์—ฌ์ฃผ๊ณ ์ž ํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค. 

(model.py) - ์ˆ˜์ •์‚ฌํ•ญ ์—†์Œ. ์ฐธ๊ณ ํ•˜๊ธฐ ์œ„ํ•ด ํ™”๋ฉด ์บก์ณ ๊ฐ€์ ธ์˜จ ๊ฒƒ

 

 

 

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'

์ž‘์„ฑํ•œ ๋’ค ctrl+s

 

2. index.html ์ˆ˜์ •

- ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ url ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋ช…์‹œํ•ด์ค€๋‹ค.

<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>

์ž‘์„ฑํ•œ ๋’ค ctrl+s