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()이 더 간결하고 직관적입니다!