✏️ 블로그 수정 기능 구현 (작성자만 수정 가능)
1️⃣ 수정 버튼은 작성자만 보이도록 처리
블로그 상세 페이지에서 로그인된 유저가 글 작성자일 경우에만 수정 버튼이 보이도록 설정합니다.
<!-- blog_detail.html -->
{% if request.user == blog.author %}
<div style="text-align: right">
<a href="{% url 'blog_update' blog.pk %}">수정</a>
{{ blog.author.username }}
</div>
{% endif %}
📌 request.user == blog.author 조건으로 비교
📌 로그인하지 않은 유저, 작성자가 아닌 유저는 버튼이 보이지 않음
2️⃣ 수정 페이지 템플릿 생성 (blog_update.html)
{% extends 'base.html' %}
{% block content %}
<h1>블로그 수정</h1>
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<button>수정</button>
</form>
{% endblock %}
📌 기존 작성된 데이터를 instance=blog로 설정하여 자동으로 값이 채워짐
📌 CSRF 토큰 필수 포함
3️⃣ 수정 뷰 함수 작성 (views.py)
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, get_object_or_404, redirect, reverse
from blog.models import Blog
from blog.forms import BlogForm
@login_required()
def blog_update(request, pk):
blog = get_object_or_404(Blog, pk=pk, author=request.user) # 작성자 본인만 접근 허용
form = BlogForm(request.POST or None, instance=blog) # 기존 데이터 기반 폼 생성
if form.is_valid():
blog = form.save()
return redirect(reverse('blog_detail', kwargs={'pk': blog.pk}))
context = {
'blog': blog,
'form': form
}
return render(request, 'blog_update.html', context)
📌 get_object_or_404(..., author=request.user) → 타인의 글은 수정 불가 (403)
📌 instance=blog로 기존 글 내용을 폼에 채워줌
4️⃣ URL 라우팅 설정 (urls.py)
path('<int:pk>/update/', views.blog_update, name='blog_update'),
📌 예: /1/update/ → ID가 1인 블로그 글 수정 페이지 이동
✅ 구현 요약
항목 설명
템플릿 조건문 | request.user == blog.author 로 수정 버튼 제한 |
수정 페이지 | blog_update.html 생성 및 작성된 값 출력 |
뷰 처리 | instance=blog 로 수정용 폼 구성 |
접근 제한 | @login_required + 작성자 필터링 |
💬 사용자 인증과 권한 체크를 조합하면, 보안적이고 신뢰성 높은 수정 기능을 만들 수 있습니다. 이 구조는 댓글, 게시판, 프로필 편집 등 다양한 곳에 응용 가능합니다.
'Django' 카테고리의 다른 글
Chapter 4-7 Django 블로그 삭제 기능 만들기 (0) | 2025.05.07 |
---|---|
Chapter 4-5 Django 블로그에 페이지네이션(Pagination) 기능 구현하기 (0) | 2025.05.07 |
Chapter 4-3 Django 작성 기능 만들기 with Form (0) | 2025.05.07 |
Chapter 4-1 Django [블로그] 상세페이지에 작성자 정보 추가하기 (0) | 2025.05.07 |
Chapter 3-7 Django 회원가입(SignUp) 및 로그인(Login) 페이지 만들기 (0) | 2025.05.06 |