django | 9. READ(Admin 데이터를 HTML에서 조회하기)

sojung·2021년 6월 15일
1

django

목록 보기
10/21
post-thumbnail

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



템플릿 태그의 3가지 유형

분기, 반복, 객체

1. 분기

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

2. 반복

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

반복 템플릿 안에서는 forloop 객체를 사용할 수 있다. forloop 객체는 반복 중 유용한 값을 제공한다.

forloop 객체 속성설명
forloop.counterfor 문의 순서로 1부터 표시
forloop.counter0for 문의 순서로 0부터 표시
forloop.firstfor 문의 첫 번째 순서인 경우 True
forloop.lastfor 문의 마지막 순서인 경우 True

3. 객체

{{ 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에 저장한 데이터이다.



똑똑하게 URL 작성하기

<!-- 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 }}이 된다.

알 수 없다.. 잘 모르겠다..

profile
걸음마코더

0개의 댓글