Study/Django

[Django] 조회와 템플릿 (8)

taecongs 2023. 9. 11. 11:36

Django 공부하기 ✨
참고 사이트 : 파이보 (점프 투 장고)


템플릿(templates)란 무엇인가?

  • Django에서 템플릿이란 어떤 텍스트 파일을 의미한다.
  • 템플릿을 통해 HTML, XML, CSV 등 어떠한 텍스트 기반 포맷의 파일도 생성할 수 있다.
  • 템플릿 자세하게 알아보기 : https://taecongs.tistory.com/62 

 

(1) 이전에 등록한 질문들을 조회 할 수 있도록 구현하기

  • 생성한 Question (질문) 목록을 출력하기 위해 pybo/views.py 파일의 index 함수를 변경해야 한다.
// (1) projects/mysite/pybo/views.py 파일 수정하기
from django.http import HttpResponse    // 삭제
from django.shortcuts import render     // 추가된 항목 
from .models import Question            // 추가된 항목

def index(request):
    question_list = Question.objects.order_by('-create_date')
    context = {'question_list' : question_list}
    return render(request, 'pybo/question_list.html', context)
  • 질문 목록 데이터는 Question.objects.order_by('-create_date') 로 얻을 수 있다.
  • order_by는 조회 결과 정렬하는 함수이다.  order_by('-create_date') 는 작성일시를 역순으로 정렬한다. (- 기호가 붙어있다면 역방향, 없으면 순방향 정렬을 의미한다.)
  • render 함수는 파이썬 데이터를 템플릿에 적용하여 HTML로 반환하는 함수이다.

 

(2) 템플릿(templates) 디렉터리 생성

  • render 함수에서 사용한 pybo/question_list.html 템플릿 파일을 작성해야 한다.
  • 우선 템플릿 파일을 저장할 디렉터리를 만들어야 한다.
  • config/settings.py 파일의 TEMPLATES 항목의 설정을 변경해야 한다.
// (2-1) projects/mysite/config/settings.py 파일 수정하기
(... 생략 ...)
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],     // 추가된 항목
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
(... 생략 ...)
  • DIRS는 템플릿 디렉터리를 여러개 등록할 수 있도록 리스트로 되어 있다.
  • 현재 프로젝트에서는 BASE_DIR / 'templates' 디렉터리 한 개만 등록한다.
// (2-2) templates 디렉터리 생성하기
(mysite) c:\projects\mysite> mkdir templates


// (2-3) 현재 프로젝트에서 사용될 폴더구조 정리
모든 앱이 공통으로 사용할 템플릿 디렉터리 - projects/mysite/templates
pybo 앱이 사용할 템플릿 디렉터리 - projects/mysite/templates/pybo
common 앱이 사용할 템플릿 디렉터리 - projects/mysite/templates/common

 

(3) 템플릿(templates) 디렉터리에 html 파일 생성하기

  • 생성한 templates 폴더에 추가로 pybo 폴더를 생성 한 후 question_list.html 을 생성한다.
// (3) projects/mysite/templates/pybo/question_list.html 생성하기
{% if question_list %}
    <ul>
    {% for question in question_list %}
        <li><a href="/pybo/{{ question.id }}/">{{ question.subject }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>질문이 없습니다.</p>
{% endif %}
  • 템플릿은 {%%} 로 둘러쌓여 있으며, 이를 템플릿 태그라고 한다.

 

(4) 템플릿(templates) 태그

  • 장고에서 사용하는 템플릿 태그는 분기, 반복, 객체 출력이 있다.
// (4-1) 분기
{% if 조건문1 %}
    <p>조건문1에 해당되는 경우</p>
{% elif 조건문2 %}
    <p>조건문2에 해당되는 경우</p>
{% else %}
    <p>조건문1, 2에 모두 해당되지 않는 경우</p>
{% endif %}

// (4-2) 반복
{% for item in list %}
    <p>순서: {{ forloop.counter }} </p>
    <p>{{ item }}</p>
{% endfor %}

// (4-3) 객체 출력
{{ 객체 }} 또는 {{ 객체.속성 }}
forloop 속성 설명
forloop.counter 루프내의 순서로 1부터 표시
forloop.counter0 루프내의 순서로 0부터 표시
forloop.first 루프의 첫번째 순서인 경우 True
forloop.last 루프의 마지막 순서인 경우 True
  • for 문 안에서는 forloop 객체를 사용할 수 있다.

 

(5) urls.py 수정하기

  • 생성된 Question (질문) 목록을 클릭하는 경우 상세 URL 설정이 필요하다.
// (5) projects/mysite/pybo/urls.py 수정하기
from django.urls import path

from . import views

urlpatterns = [
    path('', views.index),
    path('<int:question_id>/', views.detail),     // 추가된 항목
]
  • question_id에는 URL 매핑시 저장된 question_id가 전달된다.
  • http://localhost:8000/pybo/2/ 페이지가 요청되면 매개변수 question_id에 2가 세팅되어 detail 함수가 실행

 

(6) views.py 수정하기

  •  URL 매핑 규칙에 의해 실행되는 views.detail 함수를 만들어야 한다.
// (6) projects/mysite/pybo/views.py 수정하기
(... 생략 ...)

def detail(request, question_id):
    question = Question.objects.get(id=question_id)
    context = {'question': question}      
    return render(request, 'pybo/question_detail.html', context)

 

(7) question_detail.html 생성하기

  • detail 함수에서 사용할 pybo/question_detail.html 템플릿을 생성한다.
// (7) projects/mysite/templates/pybo/question_detail.html 생성하기
<h1>{{ question.subject }}</h1>
<div>
    {{ question.content }}
</div>

'Study > Django' 카테고리의 다른 글

[Django] URL 별칭 (9)  (0) 2023.09.12
[Django] 템플릿 언어  (0) 2023.09.11
[Django] 관리자 사용하기 (7)  (0) 2023.09.08
[Django] 모델 (6)  (0) 2023.09.08
[Django] URL과 View (5)  (0) 2023.09.08