[django] 점프 투 장고 - 장고 기초 4

Joy·2020년 6월 17일
0

Django | 점프투장고

목록 보기
6/22

조회와 템플릿

목록조회 & 상세조회 구현하기


목록조회

페이지에서 질문 목록 띄우게 하기 - pybo/views.py 수정

[C:\projects\mysite\pybo\views.py]

from django.shortcuts import render
from .models import Question

def index(request):
    
    """
    pybo 목록 출력
    """
    question_list = Question.objects.order_by('-create_date')
    context = {'question_list': question_list}
    return render(request, 'pybo/question_list.html', context)

풀이:
Question.objects.order_by('-create_date') : Q의 데이터(오브젝트 가져오기) 정렬하기 ''를 기준으로. -는 역순으로

render 함수 : 질문목록데이터를 ''파일에 적용해서 HTML로 변환. ''파일 = 탬플릿( HTML파일과 비슷하지만 장고에서 사용하는 태그들을 사용할수 있는 HTML파일)



템플릿 dir

템플릿 파일을 작성 전 템플릿 파일 저장할 디렉토리 만들기 - config/settings.py 파일의 TEMPLATES 항목에 추가 + dir 생성

[C:\projects\mysite\config\settings.py]

TEMPLATES = [
    {...
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
      ...
    },
]
cmd
(mysite) c:\projects\mysite>mkdir templates

설명:
DIRS : 템플릿 디렉터리를 여러개 등록할 수 있는 리스트
BASE_DIR은 c:\projects\mysite

  • 공통 템플릿 디렉터리 - C:\projects\mysite\templates
  • 파이보 앱 템플릿 디렉터리 - C:\projects\mysite\templates\pybo



템플릿 파일 작성

  1. render함수에 작성한 대로 파일명을 한 html 파일 탬플릿 dir에 해당 앱 dir에 저장하기

  2. 내용 작성

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

{% .. %} : 템플릿 태그 - html에서 py문법

결과화면:



(참고) 장고 템플릿 태그

분기

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

for 문안에 사용 가능 한 forloop 객체
forloop 속성 설명
forloop.counter 루프내의 순서로 1부터 표시
forloop.counter0 루프내의 순서로 0부터 표시
forloop.first 루프의 첫번째 순서인 경우 True
forloop.last 루프의 마지막 순서인 경우 True

객체 출력

{{ 객체 }}
{{ 객체.속성 }}



상세조회

상세페이지 만들기 - 질문 링크를 클릭하면 빈페이지임. 왜? url 매핑이 정의되지 않아서.

urls.py

  • urls.py에 상세화면로 가는 패스(url 매핑) 추가하기
[C:\projects\mysite\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는 숫자값이 매핑됨을 의미한다.)

views.py

  • views 에 detail 함수 추가
[C:\projects\mysite\pybo\views.py]

def detail(request, question_id):
    """
    pybo 내용 출력
    """
    question = Question.objects.get(id=question_id)
    context = {'question': question}
    return render(request, 'pybo/question_detail.html', context)

detail 함수 호출시 전달되는 매개변수가 request외에 question_id가 하나 더 추가

question_detail.html

  • 탬플릿 작성
[C:\projects\mysite\pybo\templates\pybo\question_detail.html]
<h1>{{ question.subject }}</h1>

<div>
    {{ question.content }}
</div>

question은 detail 함수에서 context로 넘겨받은 데이터

결과:




오류페이지

HTTP 주요 응답코드의 종류
오류코드 설명
200 성공 (OK)
500 서버오류 (Internal Server Error )
404 서버가 요청한 페이지(Resource)를 찾을 수 없음 (Not Found)

만약 id값이 없는 페이지를 요총하면 오류가 뜸.
config/settings.py 파일에 DEBUG=True로 설정 이지만 운영환경은 DEBUG=False로 설정되기 때문에 "Server Error (500)"가 발생

  • 존재하지 않는 데이터를 요청할 경우 500 오류페이지 대신 404 오류페이지를 출력하도록 detail 함수를 수정
[C:\projects\mysite\pybo\views.py]

from django.shortcuts import render, get_object_or_404

 question = get_object_or_404(Question, pk=question_id)

Question.objects.get(id=question_id) -> get_object_or_404(Question, pk=question_id)

pk는 Question모델의 기본키(Primary Key)인 id를 의미

-->> 404 오류가 출력됨.

profile
roundy

0개의 댓글