터칭 데이터

장고(Django) 템플릿에서 제어문 사용하기 본문

장고 (Django)

장고(Django) 템플릿에서 제어문 사용하기

터칭 데이터 2023. 11. 2. 23:21

템플릿에 for (제어)문으로 여러 데이터 출력하기

 

지난 시간 우리는 Question 모델에 있는 여러개의 질문들 중에서 가장 최근 질문 하나만 가져와서 index.html에서 출력했습니다.

 

그런데 템플릿에 여러개의 데이터를 출력하려면 어떻게 해야할까요?

먼저 장고 쉘(Django Shell)에서 살펴보겠습니다.

 

>>> from polls.models import *
>>> latest_question_list = Question.objects.order_by('-pub_date')[:5]
>>> latest_question_list
<QuerySet [
    <Question: NEW!!! 제목: new question, 날짜: 2023-11-02 07:09:10.103398+00:00>, 
    <Question: NEW!!! 제목: 휴가를 가실 계획인가요?, 날짜: 2023-11-02 03:36:12.245190+00:00>, 
    <Question:  제목: abc???, 날짜: 2023-11-01 05:51:02.905096+00:00>, 
    <Question:  제목: 커피 vs 녹차, 날짜: 2023-11-01 05:37:56.580508+00:00>, 
    <Question:  제목: 가장 좋아하는 디저트는?, 날짜: 2023-10-31 14:22:37+00:00>
]>


>>> for question in latest_question_list:
...     print(question.question_text)
...
new question
휴가를 가실 계획인가요?
abc???
커피 vs 녹차
가장 좋아하는 디저트는?

 

쉘에서는 위와 같이 for문을 이용해 최근 5개의 Question 로우(row)를 출력했는데요.

템플릿에서도 제어문(for, if 등의 파이썬 문법)을 사용할 수 있습니다.

 

 

 

 

템플릿에서의 인덱싱 방식

 

변수명.숫자

 

 

polls/views.py

 

지난 시간에는 context에 first_question 키에 가장 최근의 question 한개만 인덱싱 [0]으로 담아 보냈지만

이번에는 여러개의 데이터가 들어있는 쿼리셋을 통째로 render 함수의 세번째 인자 context로 보내겠습니다.

 

 

 

 

 

templates/polls/index.html

 

템플릿에서 건네 받은 context의 키 question을 이용해 인덱싱 [0]으로 접근하면 쿼리셋들 중 첫번째 값이 나올까요?

 

 

브라우저에서 새로고침을 하면

 

 

위와 같이 에러가 뜹니다.

 

왜냐하면 템플릿에서 인덱싱을 할 때는 questions[0], questions[1], ..., questions[n] 방식이 아니라

questions.0, questions.1, ..., questions.n과 같이 변수명.숫자로 표현합니다.

 

 

 

 

 

위와 같이 템플릿에서 코드를 작성하고 브라우저를 새로고침하면

 

 

우리가 기대한대로 잘 표현되는 것을 볼 수 있습니다.

 

그런데 손수 하나하나 복사, 붙여넣기하며 데이터를 작성하면 시간도 오래 걸리고 코드도 복잡해지겠죠?

이제 템플릿에서 반복문을 사용하겠습니다.

 

 

 

 

템플릿에서의 제어문 사용

 

{% 제어문 %}

...

{% end제어문 %}

 

 

index.html

 

위의 코드는 questions가 값이 존재한다면 for문으로 questions에 담긴 값들을 반복문으로 li 태그로 감싸 출력하고

존재하지 않는다면 no question이라는 문자열을 p 태그로 출력한다는 뜻입니다.

각각의 제어문 if와 for문이 끝날때 endfor와 endif를 붙여줬다는 점을 기억해주세요.

 

{% if questions %}
<ul>
    {% for question in questions %}
        <li>{{question}}</li>
    {% endfor %}
</ul>
{% else %}
<p>no question</p>
{% endif %}

 

 

 

뷰에서 context에 값을 잘 담아보냈다면

아까와 같이 정상출력 되고

 

 

 

만약에

 

 

context에 빈값을 넣어 전달했다면

 

 

우리가 템플릿의 {% else %}에서 봤듯이 no question이 출력되는 것을 볼 수 있습니다.