Chapter 5-8 📌 Mini Project - Admin 권한으로 모든 게시글 수정/삭제 가능하게 만들기

2025. 5. 8. 10:10·Django

📌 Mini Project - Admin 권한으로 모든 게시글 수정/삭제 가능하게 만들기


🎯 목표

지금까지는 일반 로그인 사용자만 자신의 글을 수정/삭제할 수 있었습니다.
이제는 관리자(Admin) 계정은 모든 글을 관리할 수 있도록 권한을 확장합니다.

이를 위해 다음과 같은 흐름으로 구현합니다:

  1. CBV에서 is_superuser 조건에 따라 쿼리셋 필터링 로직 수정
  2. 템플릿에서 관리자도 버튼이 보이도록 조건 수정
  3. 전체 코드 및 작동 흐름 명확히 정리

✅ 1단계 - CBV 코드 수정 (권한 분기 처리)

# blog/cb_views.py
from django.contrib.auth.mixins import LoginRequiredMixin
from django.db.models import Q
from django.http import Http404, HttpResponseRedirect
from django.urls import reverse_lazy
from django.views.generic import CreateView, DeleteView, DetailView, ListView, UpdateView
from blog.models import Blog

class BlogListView(ListView):
    queryset = Blog.objects.all()
    template_name = 'blog_list.html'
    paginate_by = 10
    ordering = ('-created_at', )

    def get_queryset(self):
        queryset = super().get_queryset()
        q = self.request.GET.get('q')
        if q:
            queryset = queryset.filter(
                Q(title__icontains=q) |
                Q(content__icontains=q)
            )
        return queryset

class BlogDetailView(DetailView):
    model = Blog
    template_name = 'blog_detail.html'

class BlogCreateView(LoginRequiredMixin, CreateView):
    model = Blog
    template_name = 'blog_create.html'
    fields = ('category', 'title', 'content')

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.author = self.request.user
        self.object.save()
        return HttpResponseRedirect(self.get_success_url())

class BlogUpdateView(LoginRequiredMixin, UpdateView):
    model = Blog
    template_name = 'blog_update.html'
    fields = ('category', 'title', 'content')

    def get_queryset(self):
        queryset = super().get_queryset()
        if self.request.user.is_superuser:
            return queryset  # 모든 글 접근 허용
        return queryset.filter(author=self.request.user)  # 본인 글만 수정 가능

class BlogDeleteView(LoginRequiredMixin, DeleteView):
    model = Blog

    def get_queryset(self):
        queryset = super().get_queryset()
        if not self.request.user.is_superuser:
            queryset = queryset.filter(author=self.request.user)
        return queryset

    def get_success_url(self):
        return reverse_lazy('blog:list')

✅ 2단계 - 템플릿 조건문에 Admin 포함

🔄 blog_detail.html

{% if request.user == blog.author or request.user.is_superuser %}
  <div style="text-align: right">
    <a href="{% url 'blog:update' blog.pk %}">수정</a>
    <form id="delete_form" action="{% url 'blog:delete' blog.pk %}" method="POST" style="display: inline">
      {% csrf_token %}
      <button type="button" id="delete_btn">삭제</button>
    </form>
  </div>
{% endif %}

📌 or request.user.is_superuser 조건으로 관리자도 버튼 노출되도록 설정


🔄 작동 흐름 요약 (코드 기반 프로세스 분해 설명)

▶️ ① 게시글 수정/삭제 권한 분기 처리

# CBV 내부
if self.request.user.is_superuser:
    return queryset
return queryset.filter(author=self.request.user)
  • 관리자: 모든 게시글을 조회 및 수정 가능
  • 일반 사용자: 자신이 작성한 게시글만 접근 가능

▶️ ② 템플릿에서 버튼 노출 조건 분기

{% if request.user == blog.author or request.user.is_superuser %}
    <a href="{% url 'blog:update' blog.pk %}">수정</a>
    <form action="{% url 'blog:delete' blog.pk %}" method="POST">
        {% csrf_token %}
        <button type="submit">삭제</button>
    </form>
{% endif %}
  • 작성자 또는 관리자에게만 UI 조작 버튼 노출
  • URL 보호와 UI 보호 모두 적용

▶️ ③ 삭제 버튼 클릭 시 작동 흐름

<script>
  document.querySelector('#delete_btn').addEventListener('click', function() {
    if (confirm('삭제하시겠습니까?')) {
      document.querySelector('#delete_form').submit();
    }
  });
</script>
  • JS 확인창 → 삭제 의도 확인 후 POST 요청으로 폼 전송
  • Django CBV DeleteView에서 처리됨

✅ 정리

  • 관리자 계정은 전체 글 접근 및 수정/삭제 가능
  • CBV의 get_queryset()을 통해 뷰 접근 권한 제어
  • 템플릿에서도 is_superuser 조건 추가로 UI 일관성 확보
  • 자바스크립트 confirm()으로 삭제 UX 보완

💡 이렇게 하면 관리자 페이지 외에도 프론트에서 직접 글 관리가 가능합니다!

'Django' 카테고리의 다른 글

Chapter 6-2 Bootstrap 적용으로 블로그 UI 개선하기  (0) 2025.05.09
Chapter 6-1 [블로그] 댓글 기능 만들기 - Static Files 설정과 Bootstrap 적용  (0) 2025.05.09
Chapter 5-7 📌 Django URL 구조 정리 - include와 앱 네임스페이스로 FBV/CBV 분리하기  (0) 2025.05.08
Chapter 5-6 📌 Django CBV로 블로그 글 삭제 기능 구현하기  (0) 2025.05.08
Chapter 5-5 📌 Django CBV로 블로그 글 수정 기능 구현하기  (0) 2025.05.08
'Django' 카테고리의 다른 글
  • Chapter 6-2 Bootstrap 적용으로 블로그 UI 개선하기
  • Chapter 6-1 [블로그] 댓글 기능 만들기 - Static Files 설정과 Bootstrap 적용
  • Chapter 5-7 📌 Django URL 구조 정리 - include와 앱 네임스페이스로 FBV/CBV 분리하기
  • Chapter 5-6 📌 Django CBV로 블로그 글 삭제 기능 구현하기
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (702)
      • Python (32)
      • 프로젝트 (43)
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (40)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (153)
      • 기술블로그-Flask편 (36)
      • AI 분석 (4)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
Chapter 5-8 📌 Mini Project - Admin 권한으로 모든 게시글 수정/삭제 가능하게 만들기
상단으로

티스토리툴바