먼저
1. main.html에 데이터를 볼 수 있는 question_list.html로 연결하는 링크를 생성한다.
2. question_list.html은 home/templates에 만든다.
# home/views.py
from django.shortcuts import render # render가 import 되어있다. (views.py기본 세팅)
from .models import Question # 모델 import 하기
...
def question_list(request):
# questions = Question.objects.all() # Question 모델 데이터를 questions라고 한다.
questions = Question.objects.order_by('-create_date') # Question 모델 데이터를 작성일시의 역순(-)으로 정렬한다.
context = {'questions_list' : questions } # 위의 questions를 context 변수인 question_list에 저장한다.
return render(request, 'home/question_list.html', context)
render 함수는 context에 있는 Question 모델 데이터 question_list를 HTML 코드로 변환한다. 현재는 question_list.html 파일에 적용할 것이며, 이런 파일을 템플릿(template)이라고 부르는데, 장고의 태그를 추가로 사용할 수 있는 HTML이라고 생각하면 된다.
<!-- home/question_list.html -->
<h1>질문 리스트 보기</h1>
{% if questions_list %} # 앞에서 선언한 context 변수->render 함수에서 템플릿을 전달한 Question 모델 데이터가 저장되어 있다, question_list가 있다면
<ul>
{% for question in questions_list %} # question_list를 반복하며 순차적으로 question에 대입
<li>
<a href="/home/{{ question.id }}/">{{ question.subject }}</a> # 위에서 선언한 question 객체의 id와 subject를 출력
</li>
{% endfor %}
</ul>
{% else %}
<p>질문이 없습니다.</p>
{% 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 %}
반복 템플릿 안에서는 forloop
객체를 사용할 수 있다. forloop
객체는 반복 중 유용한 값을 제공한다.
forloop 객체 속성 | 설명 |
---|---|
forloop.counter | for 문의 순서로 1부터 표시 |
forloop.counter0 | for 문의 순서로 0부터 표시 |
forloop.first | for 문의 첫 번째 순서인 경우 True |
forloop.last | for 문의 마지막 순서인 경우 True |
{{ question }}
{{ question.id }}
{{ question.subject }}
객체에 속성이 있으면 .
연선자를 사용한다.
# home/urls.py
from django.urls import path
from .views import * # home>views에서 모든 함수를 가져온다.
app_name = "home"
urlpatterns = [
...
path('<int:question_id>', question_detail, name="question_detail"), # 경로, 함수, 경로 이름, 경로는 home/<int:question_id>가 적용된다.
]
# home/views.py
...
def question_detail(request, question_id):
question = Question.objects.get(id=question_id) # urls.py에 mapping된 question_id와 같은 것
context = { 'a_question' : question } # 위의 question를 context 변수인 a_question에 저장한다.
return render(request, 'home/question_detail.html', context)
<!-- home/question_detail.html -->
<h1>{{ a_question.subject }}</h1>
<div>{{ a_question.content }}</div>
a_question 객체는 question_detail 함수에서 render 함수에 전달한 context에 저장한 데이터이다.
<!-- home/question_list.html -->
...
<!--
<a href="/home/{{ question.id }}">{{ question.subject }}</a>
대신 -->
<a href="{% url 'home:question_detail' question.id %}">{{ question.subject }}</a>
...
home/question_list.html에서 경로를 /home/{{ question.id }}/
로 하고,
home/urls.py에서 경로를 <int:question_id>
로 해서 -> /home/<int:question_id>
가 되었다.
끝에 /
가 있고 없고의 차이가 엄청 헤매었던 이유가 되었다.
그리고
home/question_list.html에서 경로를 home/{{ question.id }}
로 하면 home/home/{{ question.id }}
이 된다.
알 수 없다.. 잘 모르겠다..