Django
Chapter 5-5 📌 Django CBV로 블로그 글 수정 기능 구현하기
Chansman
2025. 5. 8. 10:05
📌 Django CBV로 블로그 글 수정 기능 구현하기
1️⃣ UpdateView로 글 수정 기능 만들기
Django의 UpdateView는 기존 객체를 수정하는 데 특화된 제너릭 뷰입니다.
로그인한 사용자만 접근하도록 LoginRequiredMixin을 함께 사용합니다.
# blog/cb_views.py
from django.views.generic import UpdateView
from django.contrib.auth.mixins import LoginRequiredMixin
class BlogUpdateView(LoginRequiredMixin, UpdateView):
model = Blog
template_name = 'blog_update.html'
fields = ('title', 'content')
def get_queryset(self):
queryset = super().get_queryset()
return queryset.filter(author=self.request.user)
✔️ get_queryset()을 오버라이드하면 해당 사용자가 작성한 글만 수정 가능하도록 제한할 수 있습니다.
2️⃣ get_absolute_url을 모델에 정의하여 리디렉션 처리하기
기존에는 get_success_url()을 오버라이딩해서 리디렉션 경로를 직접 지정했지만,
모델 내부에 get_absolute_url()을 정의하면 더 깔끔하게 처리할 수 있습니다.
# blog/models.py
from django.urls import reverse
class Blog(models.Model):
...
def get_absolute_url(self):
return reverse('cb_blog_detail', kwargs={'pk': self.pk})
✔️ 이제 UpdateView는 객체 저장 후 get_absolute_url()에 정의된 URL로 자동 리디렉션됩니다.
3️⃣ URL 연결하기
# config/urls.py
from blog import cb_views
urlpatterns = [
path('cb/<int:pk>/update/', cb_views.BlogUpdateView.as_view(), name='cb_blog_update'),
]
📍 경로: /cb/5/update/ 와 같이 특정 글 수정 페이지로 접근 가능
4️⃣ 선택적 보안 강화: get_object() 커스터마이징 (선택 사항)
# 선택적으로 사용 가능
from django.http import Http404
def get_object(self, queryset=None):
self.object = super().get_object(queryset)
if self.object.author != self.request.user:
raise Http404
return self.object
💡 get_queryset()에서 이미 작성자 필터링이 되어 있기 때문에 중복 확인은 선택적입니다.
✅ 정리
- UpdateView는 객체 수정에 최적화된 CBV입니다.
- get_absolute_url()을 모델에 정의하면 수정 완료 후 자동 리디렉션 처리 가능
- get_queryset()과 LoginRequiredMixin을 활용하면 보안성과 사용자 경험을 동시에 확보할 수 있습니다.
💡 객체 단위의 리디렉션 처리가 필요한 경우, get_success_url()보다 get_absolute_url()이 더 간결하고 직관적입니다!