[Django] 5. Template

2024. 1. 25. 16:04dev/django

728x90
반응형

이제 본격적으로 웹서버에 API요청을 하면 원하는 페이지와 함께 데이터를 전달해주는 것이다.

이것을 하기위해 Django를 배웠었고, 다시 복기를 하는 것이다.

 

Question모델을 views.py에서 재세팅을 해주기위해 다음과 같이 코드를 작성한다.

from django.shortcuts import render
from django.http import HttpResponse
from .models import Question

# Create your views here.
def index(request):
    # return HttpResponse("Hello This is donguran pybo!")
    question_list = Question.objects.order_by('-create_date')
    context = {'question_list': question_list}
    return render(request, 'pybo/question_list.html', context)

-create_date는 order_by는 순서대로 표출하는 것인데,  ' - '을 create_date앞에 주어 역순으로 정렬하라는 의미가 된다.

 

 

pybo/question_list.html이란 페이지는 도대체 어떻게 만들어야 할 것인가?

settings.py에서 먼저 템플릿 경로를 확인해준다.

 

현재 TEMPLATES항목에 'DIRS'가 비어있다.

그곳에 넣어준 값이 템플릿 페이지를 연결해주는 경로가 될 것이다.

 

BASE_DIRprojects/mysite 폴더의 경로이다.

 

templates폴더 생성

$ mkdir templates

 

 

하지만 이렇게 templates내에 여러 페이지를 한 번에 두는 것은 좋지 않다.

여러 각 역할에 맞는 웹사이트를 넣어주어야 하는 경우 분리가 필요하다.

(마치 urls.py에서 include를 사용해서 각 앱의 urls.py에 연결시켜주는 것과 동일한 맥락이다)

 

 

 

{% %} 을 템플릿 태그라고 한다.

views.py에서 context로 선언한 데이터 값을 render가 보내준 것이다.

 

{{ question.id }}이렇게 태그가 겹으로 있는 것은 값을 출력해주는 것이다.

 

출력된 페이지에서 내용을 클릭하면 Page not found에러가 발생한다.

현재 해당 페이지가 없기 때문이다.

 

 

Detail Page

그럼 pybo/2 값을 넣으면 연결시켜 나타내줄 페이지를 만든다.

먼저, 연결시켜주려면 urls.py 수정이 필요하다.

path : projects/mysite/pybo/urls.py

 

int타입의 question_id값을 매개변수로 views.detail함수로 전달한다.(매핑)

 

path : projects/mysite/pybo/views.py

 

 

그리고 question_detail.html페이지를 만든다.

 

 

하지만, 현재는 답변을 작성해놓은 것이 없기 때문에 에러 페이지가 발생하는데,

해당 페이지는 404 Not Found를 표출해주도록 한다.

 

에러페이지 띄우는 방법

import

from django.shortcuts import get_object_or_404
def detail(request, question_id):
    # question = Question.object.filter(id = question_id)
    question = get_object_or_404(Question, pk=question_id)
    context = {'question': question}
    return render(request, 'pybo/question_detail.html', context)

 

 

템플릿에 일일히 URL을 기입하다보면 실수를 할 수 있다.

<li><a href="/pybo/{{ question.id }}/">{{ question.subject }}</a></li>

 

URL에 별칭을 붙일 수 있고, 별칭을 사용해서 정확하게 URL을 요청할 수 있다.

(이건 마치 ORM, Enum과 역할이 비슷하다고 볼 수 있다)

 

URL에 별칭 넣기

path : projects/mysite/pybo/urls.py

as-is to-be

 

 

이제 템플릿에 적용해보자

as-is to-be

 

 

URL별칭은 redirect에서도 사용된다.

return redirect('pybo:detail', question_id = question.id)

728x90
반응형

'dev > django' 카테고리의 다른 글

[Django] 7. Static  (0) 2024.01.25
[Django] 6. Form  (0) 2024.01.25
[Django] 4. Admin  (0) 2024.01.25
[Django] 3. Model  (0) 2024.01.25
[Django] 2. Basic  (0) 2024.01.25