티스토리 뷰

● 게시물 상세보기 views.py

from django.http import Http404

def board_detail(request, pk):
    try:
        board = Board.objects.get(pk=pk)
    except Board.DoesNotExist:
        raise Http404('해당 게시물을 찾을 수 없습니다.')
    return render(requet, 'board_detail.html', {'board' : board})

- 생각보다 게시물 상세보기 함수는 간단하다. pk란, 데이터베이스에서 각각의 레코드를 식별하는 기본키 (Primary Key)이다. 다시 말해, 게시물 각각의 고유 번호가 된다.

 

- url에서 게시물 id 값을 받도록 하는데 이 값을 pk로 받아온다. 해당 pk값을 갖는 게시물이 존재한다면 board에 저장한다. 해당 게시물의 정보를 board_detail.html로 전달하여 화면에 표시할 수 있도록 한다.

 

만약 존재하지 않는 게시물인 경우의 예외처리를 위해 Http404 함수를 사용하여 오류 메세지를 출력한다. 

존재하지 않는 게시물의 아이디 값을 입력한 경우, 아래와 같이 Not Found 404 오류 메세지가 출력된다.

 

 

 

● 게시물 상세보기 board_detail.html

{% extends 'base.html' %}
{% block contents %}

<div class = "row mt-5">
    <div class = "col-12">
        <div class = "form-group">
            <label for = "title">제목</label>
            <input type = "text" class = "form-control" id = "title" value = "{{board.title}}" readonly>

            <label for = "contents">내용</label>
            <textarea class ="form-control" readonly>{{board.contents}}</textarea>
        </div>
        <button type = "button" class = "btn btn-primary" onclick = "location.href = '/board/list/'">돌아가기</button>
    </div>
</div>

{% endblock %}

 

- views.py 의 함수에서 넘겨받은 board의 정보만 출력하면 된다. 게시물 페이지에서는 글을 수정할 수 없도록 readonly 값을 태그에 넣어준다. 아래와 같은 화면으로 게시물 상세보기 페이지를 완성했다. 조금 어두운 테마를 사용해서 가독성이 안좋지만, 밝은 테마는 눈이 아파서 이걸로 했다.

 

 

 

- 그런데 왜 input type은 value 값으로 board 값을 주고 textarea는 왜 태그 사이에 board 값을 주는건가? 만약 input type에서 board 값을 태그 밖에 정의하면, 값은 나타나지만 아래와 같이 제목 칸 안에 들어가지 않는다. 아마도 textarea는 양끝 태그로 묶어줄 수 있기 때문이 아닐까. 

 

 

● 게시판 urls.py

from django.urls import path, include
from . import views

urlpatterns = [
    path('list/', views.board_list),
    path('write/', views.board_write),
    path('detail/<int:pk>/', views.board_detail),
]

 

- 게시물 상세보기에서는 각각의 게시물 아이디를 url에 넘겨줘야한다. 그러기 위해서 url 값을 설정할 때, detail/ 뒤에 int 형 변수가 추가되는 것을 명시한다. 그리고 그 값을 board_detail 함수에 pk라는 이름의 변수로 넘겨주게 된다. 그래서 위의 views 함수에서 pk 값을 받아올 수 있는 것이다. 

 

- 게시물 목록 board_list.html 에서는 해당 게시물을 클릭했을 때, 게시물의 id 와 함께 넘겨주기 때문에 저 값을 받아올 수 있는 것이다.

댓글