카테고리 없음

Chapter 2-5 Django - 북마크 목록 및 상세 페이지 구현

Chansman 2025. 4. 30. 16:50

📝 Django - 북마크 목록 및 상세 페이지 구현 

이번 수업에서는 Django를 이용해 북마크 목록과 상세 페이지를 구현하는 과정을 학습하였습니다. 슈퍼유저 생성부터 ORM 데이터 처리, 템플릿 구성, 예외처리까지 단계적으로 구성된 수업입니다.


1️⃣ 서버 실행 및 관리자 계정 생성

  • python manage.py runserver 명령어로 로컬 서버 실행
  • 어드민 페이지 접속: http://localhost:8000/admin
  • 슈퍼유저 생성: python manage.py createsuperuser
  • 최소 3개 이상의 북마크 데이터를 등록해 테스트 준비

2️⃣ 뷰(Views)에서 목록 데이터 가져오기

  • from bookmark.models import Bookmark 로 모델 임포트
  • ORM 메서드 Bookmark.objects.all() 을 이용해 모든 북마크 조회
  • 조회 결과를 컨텍스트에 담아 템플릿으로 전달:
  • context = { 'bookmarks': bookmarks } return render(request, 'bookmark_list.html', context)

📌 View 코드 작성 (views.py)

from django.shortcuts import render
from bookmark.models import Bookmark

def bookmark_list(request):
    bookmarks = Bookmark.objects.all()  # SELECT * FROM bookmark
    context = {'bookmarks': bookmarks}
    return render(request, 'bookmark_list.html', context)

 

3️⃣ 템플릿에 북마크 목록 출력

  • bookmark_list.html 파일에 for 문으로 목록 출력:
  • {% for bookmark in bookmarks %} <p><a href="/bookmark/{{ bookmark.id }}/">{{ bookmark.name }}</a></p> {% endfor %}
  • 각 북마크 클릭 시 상세 페이지로 이동

📌 Template 작성 (bookmark_list.html)

{% for bookmark in bookmarks %}
    <p>
        <a href="/bookmark/{{ bookmark.id }}/">{{ bookmark.name }}</a>
    </p>
{% endfor %}

4️⃣ 상세 페이지 구현

  • URL에서 <int:pk>/ 패턴으로 아이디(PK) 전달받음
  • 뷰에서 Bookmark.objects.get(pk=pk)로 단일 객체 조회
  • 템플릿에 전달할 때 컨텍스트에 객체 자체 전달:
  • context = { 'bookmark': bookmark } return render(request, 'bookmark_detail.html', context)
  • 템플릿 bookmark_detail.html에서는 다음과 같이 출력:
  • <h1>{{ bookmark.name }} 페이지입니다.</h1> <a href="{{ bookmark.url }}" target="_blank">링크</a>

📌 View 코드 수정

from django.shortcuts import render, get_object_or_404
from bookmark.models import Bookmark

def bookmark_detail(request, pk):
    bookmark = get_object_or_404(Bookmark, pk=pk)
    context = {'bookmark': bookmark}
    return render(request, 'bookmark_detail.html', context)

📌 Template 작성 (bookmark_detail.html)

<h1>{{ bookmark.name }} 페이지입니다</h1>
<a href="{{ bookmark.url }}" target="_blank">링크로 이동</a>

📌 URL 패턴 추가 (urls.py)

from django.urls import path
from bookmark import views

urlpatterns = [
    path('bookmark/', views.bookmark_list),
    path('bookmark/<int:pk>/', views.bookmark_detail),
]
 

5️⃣ URL 오류 처리 (404 예외 처리) views.py

    • 존재하지 않는 ID 접근 시, 서버 오류(500)가 아닌 사용자 오류(404)로 처리해야 함
    • 방법 1: try-except + raise Http404()
  • from django.http import Http404
    
    try:
        bookmark = Bookmark.objects.get(pk=pk)
    except Bookmark.DoesNotExist:
        raise Http404("Bookmark does not exist")
  •  
    • 방법 2: 내장 함수 get_object_or_404() 사용
from django.shortcuts import get_object_or_404 

bookmark = get_object_or_404(Bookmark, pk=pk)

✅ 더 간결하게 get_object_or_404() 함수 사용을 권장


 

  •  

4️⃣ 상세 페이지 구현

  • URL에서 <int:pk>/ 패턴으로 아이디(PK) 전달받음
  • 뷰에서 Bookmark.objects.get(pk=pk)로 단일 객체 조회
  • 템플릿에 전달할 때 컨텍스트에 객체 자체 전달:
  • context = { 'bookmark': bookmark } return render(request, 'bookmark_detail.html', context)
  • 템플릿 bookmark_detail.html에서는 다음과 같이 출력:
  • <h1>{{ bookmark.name }} 페이지입니다.</h1> <a href="{{ bookmark.url }}" target="_blank">링크</a>

5️⃣ URL 오류 처리 (404 예외 처리)

  • 존재하지 않는 ID 접근 시, 서버 오류(500)가 아닌 사용자 오류(404)로 처리해야 함
  • 방법 1: try-except + raise Http404()
  • from django.http import Http404 try: bookmark = Bookmark.objects.get(pk=pk) except Bookmark.DoesNotExist: raise Http404("Bookmark not found")
  • 방법 2: 내장 함수 get_object_or_404() 사용
  • from django.shortcuts import get_object_or_404 bookmark = get_object_or_404(Bookmark, pk=pk)

6️⃣ 주요 학습 포인트 요약

  • ✅ 북마크 리스트 → 템플릿 for문 사용으로 출력
  • ✅ 북마크 상세 → get() 또는 get_object_or_404()로 단일 데이터 처리
  • ✅ URL 연결 시 <int:pk>/ 로 식별자 전달
  • ✅ 잘못된 URL 접근 시 404 오류 처리로 UX 향상
  • ✅ URL 링크는 target="_blank"로 새창에서 열리도록 처리

💡 보너스 팁

  • 장고는 models.py의 필드명이 잘못되더라도 오류가 나지 않기 때문에, 데이터가 비어있는 경우 HTML 엘리먼트만 출력될 수 있음 → 반드시 변수명을 정확히 확인할 것

👏 수고하셨습니다! 다음 수업에서는 폼을 통해 데이터를 입력하고 저장하는 기능을 다룰 예정입니다.