장고 shortcut function : render, redirect, get_object_or_404, etc

장고 shortcut function 들을 정리해보았습니다. 어떤 short_cut이 있는지만 파악하고 자세한 내용은 공식문서를 참조하면 좋을 것 같습니다.

장고 shortcut function

  • render()– 템플릿을 랜더링해서 전달합니다.
  • redirect() – 특정 경로로 요청을 전달합니다.
  • get_object_or_404()
    • get을 호출한 후 객체가 없다면 404 에러를 raise하여 404 페이지로 이동시킵니다.
  • get_list_or_404()
    • filter를 호출한 후 빈 리스트라면 404 에러를 raise하여 404페이지로 이동합니다.

render()

render(request, template_name, context=None, content_type=None, status=None, using=None)

Required arguments

request

  • 이 응답을 생성하는 데 사용되는 요청 개체

template_name

  • 사용할 템플릿의 전체 이름

Optional arguments

context

  • 템플릿 컨텍스트에 추가할 값을 지닌 딕셔너리
  • 기본값은 빈 딕셔너리
  • 딕셔너리의 값이 호출 가능한 경우 뷰는 템플릿을 렌더링하기 직전에 해당 값을 호출

content_type

  • 결과 문서에 사용할 MIME 유형입니다. 기본값은 ‘text/html’

status

  • 응답의 상태 코드입니다. 기본값은 200

using

  • 템플릿을 로드하는 데 사용할 템플릿 엔진의 이름(dtl, jinja2)

예제 코드

from django.shortcuts import render


def my_view(request):
    # View code here...
    return render(
        request,
        "myapp/index.html",
        {
            "foo": "bar",
        },
        content_type="application/xhtml+xml",
    )

redirect()

redirect(to, *args, permanent=False, **kwargs)

다양한 방식으로 사용될 수 있습니다.

1. 뷰 이름을 인자로 입력하여 특정 뷰로 이동시킵니다. 키워드 인자를 전달합니다. URL은 reverse() 메소드를 사용하여 역방향으로 해석됩니다.

def my_view(request):
    ...
    return redirect("some-view-name", foo="bar")

2. 어떤 객체를 전달함으로써; 해당 객체의 get_absolute_url() 메서드가 호출되어 리디렉션 URL을 알아냅니다.

from django.shortcuts import redirect


def my_view(request):
    ...
    obj = MyModel.objects.get(...)
    return redirect(obj)

3. 하드코딩된 URL을 전달하여 다음으로 리디렉션

def my_view(request):
    ...
    return redirect("/some/url/")

get_object_or_404()

get_object_or_404(klass, *args, **kwargs)

인자로 입력 받은 모델 매지저에서 get()을 호출하지만 데이터가 없을 시, 모델의 DoesNotExist 예외 대신 Http404가 발생합니다.

Argument

klass

  • 객체를 가져올 Model 클래스, Manager 또는 QuerySet 인스턴스

*args

  • Q objects.

**kwargs

  • get() 및 filter()에서 허용하는 형식이어야 하는 Lookup 매개변수

기본적인 사용법

from django.shortcuts import get_object_or_404


def my_view(request):
    obj = get_object_or_404(MyModel, pk=1)

아래 코드는 get_object_or_404() 사용한 위의 코드와 동일한 동작을 하는 코드입니다.

from django.http import Http404


def my_view(request):
    try:
        obj = MyModel.objects.get(pk=1)
    except MyModel.DoesNotExist:
        raise Http404("No MyModel matches the given query.")

get_object_or_404() 없이 매니저를 사용하여 get한 경우

  • 단순히 object.get을 사용한 경우에는 없는 모델에 없는 데이터를 요청 시, 사용자는 알 수 없는 에러 메시지를 내뿜습니다.
def article_details(request, id):
    articles = Articles.objects.get(id=id)
    context = {"articles": articles}
    return render(request, "article_details.html", context)

모델에 없는 데이터로 URL 요청 시 결과

get_object_or_404 사용

from django.shortcuts import get_object_or_404, render, redirect

def article_details(request, id):
    articles = get_object_or_404(Articles, pk=id)
    context = {"articles": articles}
    return render(request, "article_details.html", context)

사용자가 직관적으로 무엇이 에러인지 알 수 있게 됩니다.

모델에 없는 데이터를 URL로 요청 시, 404로 변경함

get_list_or_404()

get_list_or_404(klass, *args, **kwargs)

Arguments

klass

  • A Model, Manager or QuerySet instance from which to get the list.

*args

  • Q objects.


**kwargs

  • Lookup parameters, which should be in the format accepted by get() and filter()

예제

from django.shortcuts import get_list_or_404


def my_view(request):
    my_objects = get_list_or_404(MyModel, published=True)

아래 코드는 위의 코드와 동일하게 동작합니다.

from django.http import Http404


def my_view(request):
    my_objects = list(MyModel.objects.filter(published=True))
    if not my_objects:
        raise Http404("No MyModel matches the given query.")

참고하면 좋은 글

공식 문서 : https://docs.djangoproject.com/en/4.2/topics/http/shortcuts/#module-django.shortcuts

Leave a Comment

목차