본문 바로가기
Django

(5) Pybo 질문 목록과 상세 기능 구현하기

by kingyejin 2024. 7. 2.

 

지금은 위 페이지를 요청하면 앞서 설정해준대로 "안녕하세요 pybo 입니다." 라는 문구가 출력될 것이다.

질문 목록이 출력되도록 pybo/views.py 파일의 index 함수를 다음과 같이 변경하자.

Question.objects.order_by('-create_date') | 질문 목록 데이터 얻을 수 있음
order_by('-create_date') | 작성일시 역순으로 정렬 (- 기호가 붙어 있으면 역방향, 없으면 순방향 정렬을 의미)
render 함수 | 질문 목록으로 조회한 question_list 데이터를 pybo/question_list.html 파일에 적용해 HTML 생성 후 리턴
pybo/question_list.html  파일 | 템플릿

템플릿 디렉터리

이제 render 함수에서 사용한 pybo/question_list.html 템플릿 파일을 작성해야 한다.

하지만 템플릿 파일을 작성하기 전에 템플릿 파일을 저장할 디렉터리를 먼저 만들어야 한다.

이는 config/settings.py 파일의 TEMPLATES 항목에 설정을 추가하자.

BASE_DIRS
템플릿 디렉터리를 여러개 등록할 수 있도록 리스트

 

BASE_DIR c:\projects\mysite 이므로 추가한 디렉터리의 전체 경로는 다음과 같을 것이다.

c:\projects\mysite\templates

이 디렉터리는 없으므로 다음과 같이 생성하자.

mkdir templates
cd templates
mkdir pybo


템플릿 파일 생성

이제 템플릿 파일을 만들어 보자.

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

 

question_list.html에 사용된 템플릿 태그들을 하나씩 살펴보자.


템플릿 태그

장고에서 사용하는 템플릿 태그는 다음 3가지 유형만 알면 된다.

또한  항상 {% endif %} 태그로 닫아주어야 한다는 점을 잊지 말자.

-분기-

{% if 조건문1 %}
    <p>조건문1에 해당되는 경우</p>
{% elif 조건문2 %}
    <p>조건문2에 해당되는 경우</p>
{% else %}
    <p>조건문1, 2에 모두 해당되지 않는 경우</p>
{% endif %}

-반복-

{% for item in list %}
    <p>순서: {{ forloop.counter }} </p>
    <p>{{ item }}</p>
{% endfor %}

-객체 출력-

{{ 객체 }}

 예) {{ item }} -> 객체에 속성이 있는 경우는 파이썬과 동일한 방법으로 도트(.) 문자를 이용하여 표시하면 된다.

{{ 객체.속성 }}

 예) {{question.id}}, {{question.subject}}

 

-테스트-

여기까지 수정하고 http://localhost:8000/pybo/ 페이지를 요청하면 다음과 같이 변경된 화면을 볼 수 있을 것이다.

 


-urls.py-

다음 질문 중 하나를 클릭해보면 아래와 같은 오류가 표시될 것이다.

http://localhost:8000/pybo/2/와 같은 페이지에 대한 URL매핑이 아직 없기 때문이다.

 

질문 목록 화면에서 링크를 클릭하여 요청한 질문 상세 URL은 다음과 같다.

http://localhost:8000/pybo/2/
#id 값이 2인 Question을 상세 조회한다.

 

 

이 URL이 동작할 수 있도록 pybo/urls.py 파일을 다음과 같이 수정하자.

path('<int:question_id>/', views.detail) 라는 URL 매핑을 추가했다.

 

이제 http://localhost:8000/pybo/2/ 페이지가 요청되면 question_id2가 저장되고 views.detail 함수도 실행될 것이다. <int:question_id> 에서 int는 숫자가 매핑됨을 의미한다.


-views.py-

 

이제 위 URL 매핑 규칙에 의해 실행되는 views.detail 함수를 만들어야 한다. 

다음처럼 pybo/views.py 파일에 detail 함수를 추가하자.

 

다시 http://localhost:8000/pybo/2/ 페이지를 요청해 보면 아래와 같이 질문 상세 기능이 만들어진 것을 볼 수 있다!

 

'Django' 카테고리의 다른 글

(7) 데이터 저장 및 스태틱  (0) 2024.07.02
(6) URL 별칭  (0) 2024.07.02
(4) 장고 관리자  (1) 2024.07.02
(3) 장고에서 모델 사용하기  (0) 2024.07.01
(2) phybo 앱 생성 및 장고 프로그램 만들기  (2) 2024.07.01