본문 바로가기
개인 공부/개발

장고 조회와 템플릿

by 아메리카노와떡볶이 2021. 8. 4.
728x90

질문 목록

앞서 생성한 Question 모델의 객체들을 조회하는 게시판을 구현해보자.

현재는 위와 같이 "안녕하세요 지금은 django 실습 중입니다." 라는 문자열이 등장한다.

위 코드에서는 단순히 url에 대한 응답으로 문자열을 반환해주고 있다. 우리는

Question 모델의 객체들에 대한 정보를 화면에 출력해야하므로 수정이 필요하다

view.py를 위와 같이 수정해준다. 우리는 pybo 앱에서 생성한 Question 모델의 객체들을 화면에 출력하기 위해서

객체 리스트를 가져와야한다.

Question.objects.order_by('-create_date')는 Question 객체들을 생성날짜의 역순으로 정렬해서 리스트로 가져오는 것이다

 

render 함수는 파이썬 데이터를 템플릿에 적용해서, HTML로 반환하는 함수이다. 즉 위에서는

question_list 데이터를 pybo/question_list.html 파일에 적용하여 html을 리턴한다.

여기서 사용된 pybo/question_list.html 파일을 템플릿이라고 한다.

DIRS는 템플릿 디렉터리를 여러개 등록할 수 있도록 리스트로 되어 있다. 파이보는 BASE_DIR / 'templates' 디렉터리만 등록하자.

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

render 함수에서 사용한 템플릿은 pybo/question_list.html 템플릿 파일이었다.

이 템플릿은 파이보 앱에서만 사용할 것이기때문에

D:\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 %}

 

템플릿 태그

장고에서 사용되는 템플릿 태그의 대표적인 유형 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 %}

3. 객체 출력

https://docs.djangoproject.com/en/3.0/topics/templates/

 

Templates | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 

url 매핑 실전

질문 목록에서 질문을 클릭하면 위와 같은 오류페이지가 뜬다. 왜냐하면 아직 url 매핑이 안되었기때문에

url을 살펴보면, id 값이 2인 Question을 조회하고 싶다는 뜻이다.

http://127.0.0.0:8000/pybo/2/

이 url이 동작할 수 있게, pybo 앱의 urls.py 파일에 매핑을 시켜주어야한다.

from django.urls import path

from . import views

urlpatterns = [
    path('', views.index),
    path('<int:question_id>/', views.detail),
]

 

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

 

url 끝에 /2/ 처럼 question의 id가 올때, view.py에 detail 함수로 매핑시켜주었다. 아직 detail 함수를

정의하지 않았기때문에 정의해주어야한다.

 

view.py에 detail 메소드를 추가했다. 매개변수를 보면 알수있듯이 매핑과정에서 question_id를 전달받는다.id에 맞는 객체를 question에 저장하고, render 함수를 통해 템플릿 파일을 반환한다.

 

question_detail.html 템플릿파일은 위와같이 단순하게 제목과 내용을 화면에 출력하게만 구현하자.

 

성공!

728x90

'개인 공부 > 개발' 카테고리의 다른 글

장고 데이터 저장과 스타일 시트  (0) 2021.08.05
장고 URL과 네임스페이스  (0) 2021.08.04
장고 관리자  (0) 2021.08.02
장고의 기본 요소(url과 view)  (0) 2021.07.29
장고 개발 환경 설정  (0) 2021.07.29

댓글