본문 바로가기
Develop/Django(Exercise)_v1

5. 에러 데이터 처리 / 상세페이지 만들기

by 보보트레인 2023. 9. 15.

1.에러데이터 처리

뷰를 다음과 같이 고친다.

from django.shortcuts import render, get_object_or_404
from .models import Photo

# Create your views here.
def photo_list(request):
    photos = Photo.objects.all()
    return render(request, 'photo/photo_list.html', {'photos': photos})

def photo_detail(request, pk):
    photo = get_object_or_404(Photo, pk=pk)
    return render(request, 'photo/photo_detail.html', {'photo': photo})

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

→ 위 코드에서는 pk, 즉 우리 모델의 데이터들을 구분하는 Django 기본 ID값으로 데이터를 찾는다.


2. 상세페이지 만들기

photo/templates/photo 안에 상세페이지 html을 photo_detail.html이라는 이름으로 다음과 같이 만든다.

<html>
    <head>
        <title>Photo App</title>
    </head>
    <body>
        <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>

views.py에 관련 함수를 추가한다.

from django.shortcuts import render, get_object_or_404

def photo_detail(request, pk):
    photo = get_object_or_404(Photo, pk=pk)
    return render(request, 'photo/photo_detail.html', {'photo': photo})

pk, 즉 우리 모델의 데이터들을 구분하는 Django 기본 ID값으로 데이터를 찾는다. ( 어드민 페이지 참조 )

 

photo/url.py를 다음과 같이 고친다.

from django.urls import path
from . import views

urlpatterns = [
    path('', views.photo_list, name='photo_list'),
    path('photo/<int:pk>', views.photo_detail, name='photo_detail'),
]

pk라는 이름의 정수형 변수가 들어갈 자리를 설정한다.

 

photo_list.html 템플릿에 반영한다.

(본 페이지에서 상세페이지로 넘어가므로 본 페이지에도 상세페이지에 대한 내용이 반영되어야 한다.)

<html>
    <head>
        <title>Photo App</title>
    </head>
    <body>
        <h1><a href="">사진 목록 페이지</a></h1>
        <section>
            {% for photo in photos %}
            <div>
                <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>

url과 pk를 잘 담아서 mapping 해준다.

 

<결과화면>

photo_list.html에서 사진 제목을 클릭하면

다음과 같은 상세페이지 ( url = /photo/1(pk) ) 로 잘 넘어가는 것을 확인할 수 있다.

상세페이지

반응형