목록과 상세 뷰 만들기

Kangjik Kim·2025년 1월 8일
0

쟝고 뷰는 웹 요청을 수신하고 웹 응답을 반환하는 파이썬 함수이다.

원하는 응답을 반환하는 모든 로직은 뷰에 들어간다.

먼저 애플리케이션 뷰를 생성하고 뷰에 맞는 URL 패턴을 정의한다.

그리고 뷰에서 생성된 데이터를 렌더링하는 HTML 템플릿을 생성한다.

각 뷰는 템플릿을 렌더링하고 변수를 전달해 렌더링된 출력과 함께 HTTP 응답을 반환한다.

목록 및 상세 뷰 생성하기

게시물의 목록을 보여주는 뷰를 만들어 보자.

blog 애플리케이션의 views.py 파일을 편집해 다음과 같이 만든다.

from django.shortcuts import render
from .models import Post

# Create your views here.

def post_list(request):
    posts = Post.published.all()
    return render(request, 'blog/post/list.html', {'posts': posts})

post_list 뷰는 request 객체를 유일한 매개 변수로 사용한다.
이 매개변수는 모든 뷰에 필요하다.

쟝고에서 제공되는 shortcut 함수 render()를 사용해 주어진 템플릿으로 게시물 목록을 렌더링할 수 있다. 이 함수는 rquest 객체, 템플릿 경로 및 context 변수를 사용해 주어진 템플릿을 렌더링하는데, 렌더링된 텍스트와 함께 HttpResponse 객체를 반환한다.

render() 숏컷 함수는 요청에 관련된 정보를 템플릿에 전달할 때 사용된다.

지정된 템플릿에 설정된 모든 변수는 템플릿 context 프로세서에 의해 접근 가능하다.

하나의 게시글을 표현하는 두 번째 뷰를 만들어 보자.
views.py 파일에 아래의 함수를 추가하자.

from django.http import Http404

def post_detail(request, id):
    try:
        post = Post.published.get(id=id)
    except Post.DoesNotExist:
        raise Http404('No post found')

    return render(request, 'blog/post/detail.html', {'post': post})

이 뷰는 게시글의 id의 인수를 사용한다.
뷰에서 우리는 기본 objects 관리자에서 get() 메서드를 호출해서 주어진 id를 가진 Post 객체를 조회하려 하고, 결과가 없어 DoesNotExist 예외가 발생할 경우 Http404 예외를 발생시킨다.

get_object_or_404 숏컷 함수 사용하기

쟝고는 주어진 모델 관리자에서 get()을 호출하고, 객체가 발견되지 않을 경우 DoesNotExist 예외 대신 Http404 예외를 발생하는 get_object_or_404 숏컷 함수를 제공한다.

views.py 파일을 편집해 get_object_or_404 숏컷 함수를 import한 후 post_detail 뷰에서 사용해보자.

from django.shortcuts import get_object_or_404

def post_detail(request, id):
    post = get_object_or_404(Post, id=id, status=Post.Status.PUBLISHED)

    return render(request, 'blog/post/detail.html', {'post': post})

상세 보기에서 이제 get_object_or_404() 함수를 사용해 원하는 게시물을 조회한다.

이 함수는 주어진 매개 변수와 일치하는 객체를 찾고 해당 객체가 없으면 404 예외를 발생시킨다.

뷰에 맞는 URL 패턴 추가하기

URL 패턴을 사용해 URL을 뷰에 매핑할 수 있다.

URL 패턴은 문자열 패턴, 뷰 및 선택적으로 프로젝트 전체의 URL 이름을 지정할 수 있는 이름으로 구성된다.

쟝고는 각 URL 패턴을 살펴 요청된 URL과 일치하는 첫 번째 패턴을 찾아낸다.
그 다음 일치하는 URL 패턴의 뷰를 가져와, HttpRequest 클래스의 인스턴스와 키워드 또는 위치 인수를 전달해 실행한다.

blog 애플리케이션의 디렉토리에 urls.py 파일을 만들고 다음 줄을 추가한다.

from django.urls import path
from . import views

app_name = 'blog'
urlpatterns = [
    path('', views.post_list, name='post_list'),
    path('<int:id>/', views.post_detail, name='post_detail'),
]

코드에서는 app_name 변수를 사용해 애플리케이션 네임스페이스를 정의한다.

이를 통해 애플리케이션 별로 URL을 구성하고 참조할 때 이름을 사용할 수 있다.

path() 함수를 사용해 두 가지 다른 패턴을 정의했는데,
첫 번째 URL 패턴은 어떤 인수도 취하지 않고 post_list 뷰에 매핑된다.
두 번째 URL 패턴은 post_detail 뷰에 매핑되며 패스 컨버터에 int로 설정되어 정수 값으로 매칭되는 하나의 인자 id만을 취한다.

URL에서 값을 캡쳐하기 위해 꺾쇠괄호를 사용할 수 있는데, 처럼 URL 패턴에 지정된 모든 값은 문자열로 캡쳐된다.
<int:year>와 같이 패스 컨버터를 사용해 일치되는 값을 정수로 반환한다.
예를 들어 <slug:post>는 명시적으로 슬러그와 일치하도록 한다.

path() 및 컨버터를 사용하는 것으로 충분하지 않은 경우 re_path()를 사용해 정규식으로 복잡한 URL 패턴을 정의할 수 있다.

다음으로 프로젝트의 기본 URL 패턴에 blog 애플리케이션의 URL 패턴을 포함해야 한다.

프로젝트 mysite 디렉토리에 있는 urls.py 파일을 편집해 아래와 같이 만들자.

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls', namespace='blog')),
]

include로 정의된 새로운 URL 패턴은 blog/ 하위 경로를 포함시키기 위해 blog 애플리케이션에 정의된 URL 패턴을 참조한다.

blog 네임스페이스 하위에 해당 패턴들을 포함시키므로 네임스페이스는 전체 프로젝트에서 고유해야 한다. 네임스페이스 뒤에 콜른과 URL 이름을 사용해 블로그 URL을 쉽게 참조할 수 있다. (blog:post_list, blog:post_detail)

0개의 댓글