try/except를 이용해서 에러를 핸들링해보려고 한다.
에러를 그냥 긁어서 붙였던 일반 파이썬과 달리 에러를 모델 내부 에러 속성을 따와서 써야 한다.
다음 코드는 pk에 해당하는 정보가 없으면 redirect 하도록 처리한 코드이다.
from django.urls import reverse
from django.shortcuts import render, redirect
from . import models
def room_detail(request, pk):
try:
room = models.Room.objects.get(pk=pk)
except models.Room.DoesNotExist:
return redirect(reverse("core:home"))
return render(request, "rooms/detail.html", {"pk": pk, "room": room})
404 페이지를 만들어 처리할 수도 있다.
독특하게도, Http404 에러를 raise하면 templates에 있는 404.html을 자동으로 찾아서 렌더링한다.
404.html을 templates 내의 다른 폴더에 옮기면 django가 찾지 못하므로 주의하자.
from django.http import Http404
from django.shortcuts import render, redirect
from . import models
def room_detail(request, pk):
try:
room = models.Room.objects.get(pk=pk)
except models.Room.DoesNotExist:
raise Http404() # templates/404.html을 자동 렌더링한다.
return render(request, "rooms/detail.html", {"pk": pk, "room": room})
CBV의 경우 DetailView를 Generic View로 사용하는 경우 별도로 Http404 설정을 해주지 않아도 404.html을 찾습니다.
class RoomDetail(DetailView):
model = models.Room
'Django, Flask > 🔫 Django' 카테고리의 다른 글
django + PostgreSQL (0) | 2020.08.13 |
---|---|
Forms API 와 validation (0) | 2020.07.03 |
get_absolute_url로 admin panel에서 곧바로 view로 가자 (0) | 2020.06.16 |
Path Converter와 namespace, name을 활용한 link (0) | 2020.06.16 |
Class Based Views(CBV) 근데 generic-display를 곁들인 (0) | 2020.06.16 |