본문 바로가기
Python/Django Ⅱ

게시물 상세보기 페이지 구현 + get_object_or_404

by Mr.DonyStark 2024. 5. 14.

□ 앞에서 우리는 게시물을 등록하고 게시되는 것을 구현했음

https://dandora-90.tistory.com/339

 

V : View(뷰)

중간정리 : Model, Template 작업처리가 끝났다면 app의 view.py에서 작업을 진행해야함.→ Model 작업https://dandora-90.tistory.com/337 M : Model(모델)1. 모델은 프로젝트를 위한 앱의 데이터와 관련된 부분이며,

dandora-90.tistory.com

 

이에 이어서 등록된 게시물만을 볼 수 있는 상세보기 페이지를 구현하고자함

 코드

 ○ T : Templete(템플릿)

   - photo_list.html 코드 : 게시글 제목을 클릭하면 photo_detail urlname을 가진 화면으로 이동

<html>
  <head>
    <title>Photo App</title>
  </head>
  <body>
    <h1><a href="">사진 목록 페이지</a></h1>
    <h3><a href="{% url "photo_post" %}">Photo 등록</a></h3>
    <section>
        <!--템플릿태그-->
        {% for photo in photos %}
      <div>
        <p>{{photo.pk}} 번쨰</p>
        <h2>
          <a href="{% url 'photo_detail' pk=photo.pk %}">{{photo.title}}</a>
        </h2>
        <img src="{{photo.image}}" alt="{{photo.title}}" width="300" />
        <p>{{photo.description}}</p>
        <p>{{photo.author}}, {{photo.price}}</p>
      </div>
      {% endfor %}
    </section>
  </body>
</html>

 

   - photo_detail.html 코드 : 수정하기 버튼을 클릭하면 urlpatterns에서 정의한 photo_edit 페이지로 이동되도록 구현

<html>
  <head>
    <title>Photo App</title>
  </head>
  <body>
    <!--템플릿태그-->
    <a href="/">홈으로 돌아가기</a> <!--메인화면이동-->
    <h1>{{photo.title}}</h1>
    <h3>
      <!-- url 호출시 photo_edit 함수 작동-->
      <a href="{% url "photo_edit" pk=photo.pk %}">수정하기</a>
    </h3>
    <section>
      <div>
        <img src="{{photo.image}}" alt="{{photo.title}}" width="300" />
        <p>{{photo.description}}</p>
        <p>{{photo.author}}, {{photo.price}}</p>
      </div>
    </section>
  </body>
</html>

 

 ○ V : View(뷰)

   - get_object_or_404() : 모델로부터 데이터를 찾아보고 만약 찾는 데이터가 없다면 404 에러를 반환하는 함수임

   - 등록된 게시글을 클릭하면 해당 글에대한 pk를 바탕으로 값을 가져와야하므로 pk를 매개변수로 받도록 지정

   - photo_detail.html rendering 되며 등록된 게시글 pk에 부합하는 정보를  반환

from django.shortcuts import render, get_object_or_404, redirect #get_object_or_404 : 모델로부터 데이터를 찾아보고 만약 찾는 데이터가 없다면 404 에러 반환
from .models import Photo #orm을 활용해 app>photo 의 Photo 값을 호출
from .forms import PhotoForm #post 방식으로 받은 form 호출

#app photo 의 photo_list 함수 정의 
def photo_list(request):
    #app photo > model에서 정의한 클래스를 .object.all()로 모두 가져와 photos에 담음. photos는 템플릿파일에 활용됨.
    photos = Photo.objects.all()
    return render(request, "photo/photo_list.html",{"photos":photos})

#app photo 의 photo_detail 함수 정의
def photo_detail(request,pk):
    photo = get_object_or_404(Photo, pk=pk)
    return render(request,"photo/photo_detail.html", {"photo":photo})

 

 ○ URL

   - View에서 정의한 photo_detial request시 photo_detail이라는 name으로 화면 전환

   - 이떄 url 주소는 http://127.0.0.1:8000/photo/<int:pk>

from django.urls import path
from . import views

#app photo > view에서 정의한 photo_list 함수 
urlpatterns = [
    #"" 은 settings.py 에서 허용한 주소가 기본으로 들어감
    path("", views.photo_list, name="photo_list"),
    #models pk 정수형으로 들어가야하므로 <int:pk>
    path("photo/<int:pk>/", views.photo_detail, name="photo_detail"), #상세보기
    ]

 

좌 : photo_list 화면 / 우 : 등록된 게시글 클릭을 통한 photo_detail 화면

'Python > Django Ⅱ' 카테고리의 다른 글

Django 게시물 수정하기  (0) 2024.05.14
Django Form 기능 / 게시물 등록하기  (0) 2024.05.14
V : View(뷰)  (0) 2024.05.03
T : Template(템플릿)  (0) 2024.05.03
M : Model(모델)  (1) 2024.05.02