장고 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)
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)
사용자가 직관적으로 무엇이 에러인지 알 수 있게 됩니다.
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