카테고리 없음

처음보는 Django 연습하기 [3단계]

미미밍2 2021. 8. 18. 22:53
728x90
반응형

- 템플릿 Html 파일 연결하기

- URL, View가 템플릿과 어떻게 연결 되는가?

 

뷰(View) - Django 웹의 로직을 담당한다. 웹에서 일어나는 데이터 저장, 파일 다운로드 등의 일을 처리한다.

 

프로젝트에서 View 만들어보기 

4가지 View를 만들어보자.

1) Question 색인 페이지 : 최근 질문들을 표시한다.

2) Question 세부 페이지 : 질문 내용과, 투표할 수 있는 서식을 표시한다.

3) Question 결과 페이지 : 특정 질문에 대한 결과를 표시한다.

4) 투표 기능 : 특정 질문에 대해 특정 선택을 할 수 있는 투표 기능을 제공한다.

 

#polls/views.py 수정

from django.shortcuts import render
# Create your views here.
from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

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)

request라는 인자를 받고 HttpResponse라는 함수로 return 한다.

고객에게 request를 받게 되면, 여러가지 정보를 request가 담게 된다. 이후 Respose를 return 해준다.

 

뷰(view.py)를 호출, 연결하기 위해서, urls.py를 수정해주어야 한다.

#polls/urls.py 수정
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'),
]
ex:/polls/

고객이 해당 주소를 호출하게 되면, ' ' 아무것도 없으므로 views.index가 호출 된다.

= 해당 주소로 view의 index가 호출이 된다. view.py에서 "Hello world"라는 문자열이 나타나게 될것이다.

ex:/polls/5

polls 다음에 question_id=5로 주소 뒤에 5를 전달해주었다.

veiw.py의 detail(상세 페이지)이 호출이 되고, "You're looking at question 5"라는 문자열이 나타난다.

ex:/polls/5/results/
ex:/polls/5/vote/

results 결과페이지 주소를 전달해주면, view.py의 results가 호출이 되고, 

vote 결과페이지 주소를 전달해주면, view.py의 vote가 호출이 된다.


Hello World 대신 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)

Question 데이터 중 pub_date를 정렬하여 5개까지 가지고 온 후, 

5개를 ' , '로 연결해준다. 문자열로 변경하여 return 해준다.


고객에게 보여주는 View를 일일이 고쳐주기에는 어렵다. Templates를 활용하여 쉽게 변경 할 수 있도록 만든다.

각 앱 별로 html파일을 설정해준다.

polls/templates/앱이름/index.html

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


Render

render를 활용하면 loader,HttpRespose 없이 간단한 형태로 사용가능하다.

from django.shortcuts import render

from .models import Question


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)

404 에러 일으키기

from django.http import Http404
from django.shortcuts import render

from .models import Question
# ...
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})
728x90
반응형