Django
Chapter 5-4 📌 Django CBV - LoginRequiredMixin과 CreateView로 블로그 글 작성 기능 구현하기
Chansman
2025. 5. 8. 10:04
📌 Django CBV - LoginRequiredMixin과 CreateView로 블로그 글 작성 기능 구현하기
1️⃣ CBV로 글 작성 기능 추가하기
Django의 CreateView를 사용하면 새로운 객체 생성 폼을 간단히 구현할 수 있습니다.
LoginRequiredMixin을 함께 적용하면 로그인한 사용자만 글 작성이 가능하도록 제한할 수 있습니다.
# blog/cb_views.py
from django.contrib.auth.mixins import LoginRequiredMixin
from django.http import HttpResponseRedirect
from django.urls import reverse_lazy
from django.views.generic import CreateView
from blog.models import Blog
class BlogCreateView(LoginRequiredMixin, CreateView):
model = Blog
template_name = 'blog_create.html'
fields = ('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())
def get_success_url(self):
return reverse_lazy('cb_blog_detail', kwargs={'pk': self.object.pk})
🔐 LoginRequiredMixin이란?
- 이 믹스인은 로그인된 사용자만 뷰에 접근할 수 있도록 제한합니다.
- 로그인하지 않은 사용자가 접근하면 자동으로 로그인 페이지로 리디렉션됩니다.
class BlogCreateView(LoginRequiredMixin, CreateView):
...
🔒 실무에서 민감한 데이터 생성, 수정, 삭제 작업에는 항상 로그인 여부 확인이 필요합니다.
2️⃣ 작성 완료 후 이동 경로 설정: get_success_url()
- 블로그 글 작성이 완료되면 get_success_url() 에서 리디렉션할 경로를 정의합니다.
def get_success_url(self):
return reverse_lazy('cb_blog_detail', kwargs={'pk': self.object.pk})
🔁 reverse_lazy는 urls.py의 name을 기반으로 URL을 지연 로딩하여 반환합니다.
3️⃣ URL 연결하기
# config/urls.py
from blog import cb_views
urlpatterns = [
path('cb/', cb_views.BlogListView.as_view(), name='cb_blog_list'),
path('cb/<int:pk>/', cb_views.BlogDetailView.as_view(), name='cb_blog_detail'),
path('cb/create/', cb_views.BlogCreateView.as_view(), name='cb_blog_create'),
]
🆕 /cb/create/ 경로에서 로그인한 사용자만 글 작성 가능
4️⃣ 템플릿 예시 (blog_create.html)
<h1>블로그 글 작성</h1>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">작성하기</button>
</form>
✅ 정리
- CreateView는 글 작성 로직을 최소 코드로 처리할 수 있게 도와주는 강력한 제너릭 뷰입니다.
- LoginRequiredMixin을 함께 사용하면 보안성을 강화할 수 있습니다.
- form_valid()에서 작성자를 수동으로 지정하고, get_success_url()에서 상세 페이지로 리디렉션하는 방식으로 사용자 친화적 흐름을 만들 수 있습니다.
💡 사용자 인증 기반의 CRUD 구현 시 CBV + 믹스인 조합은 필수 패턴입니다!