Django
Chapter 4-3 Django 작성 기능 만들기 with Form
Chansman
2025. 5. 7. 10:29
📝 Django Forms로 블로그 글 작성 기능 만들기
💡 Django Forms의 핵심 역할
- HTML <form> 자동 생성
- 데이터 유효성 검사 (Validation)
- 모델 인스턴스 저장 및 업데이트
1️⃣ 블로그 폼 정의하기 (forms.py)
경로: blog/forms.py
from django import forms
from blog.models import Blog
class BlogForm(forms.ModelForm):
class Meta:
model = Blog
fields = ('title', 'content') # 필요한 필드만 선택 가능, 전체는 '__all__'
📌 ModelForm을 상속하여 모델 기반의 폼 자동 생성
📌 사용자 입력을 받아 Blog 모델에 저장 가능
2️⃣ 뷰에서 BlogForm 활용 (views.py)
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect, reverse, get_object_or_404
from blog.forms import BlogForm
from blog.models import Blog
@login_required()
def blog_create(request):
form = BlogForm(request.POST or None) # POST 요청 시 데이터 포함, 아니면 빈 폼
if form.is_valid():
blog = form.save(commit=False) # DB 저장 전 author 정보 추가를 위해 지연
blog.author = request.user
blog.save()
return redirect(reverse('blog_detail', kwargs={'pk': blog.pk}))
context = {'form': form}
return render(request, 'blog_create.html', context)
📌 commit=False를 통해 author처럼 폼에 없는 필드를 수동 설정 가능
📌 @login_required() 데코레이터로 인증된 사용자만 접근 허용
📌 로그인하지 않은 경우 settings.LOGIN_URL로 리디렉션됨
3️⃣ URL 패턴에 create 경로 추가 (urls.py)
path('create/', views.blog_create, name='blog_create'),
📌 /create/ URL에 블로그 작성 페이지 연결
4️⃣ 블로그 작성 템플릿 구성 (blog_create.html)
{% extends 'base.html' %}
{% block content %}
<h1>블로그 작성</h1>
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<button>생성</button>
</form>
{% endblock %}
📌 form.as_p는 입력 필드를 <p>로 감싸 출력
📌 CSRF 토큰 필수 포함
5️⃣ 로그인 리디렉션 처리 (member/views.py)
def login(request):
form = AuthenticationForm(request, request.POST or None)
if form.is_valid():
django_login(request, form.get_user())
next = request.GET.get('next') # 로그인 이전 접근 경로 기억
if next:
return redirect(next)
return redirect(reverse('blog_list'))
context = {'form': form}
return render(request, 'registration/login.html', context)
📌 비로그인 상태에서 /create/ 접근 시 로그인 후 자동 리디렉션됨
6️⃣ 최신 글이 위로 오도록 정렬 (blog_list)
def blog_list(request):
blogs = Blog.objects.all().order_by('-created_at') # 최신순 정렬
context = {'blogs': blogs}
return render(request, 'blog_list.html', context)
7️⃣ 블로그 목록 페이지에 글쓰기 버튼 추가
{% block content %}
<h1>블로그 목록</h1>
<p style="text-align: right">
<a href="{% url 'blog_create' %}">생성</a>
</p>
{% for blog in blogs %}
<p>
<a href="{% url 'blog_detail' blog.pk %}">
{{ blog.title }} - <small>{{ blog.created_at|date:"Y-m-d" }}</small>
</a>
</p>
{% endfor %}
{% endblock %}
📌 로그인하지 않은 상태에서 버튼 클릭 시 로그인 페이지로 이동
✅ 요약 체크리스트
항목 설명
BlogForm 작성 | ✅ forms.ModelForm 상속으로 구현 |
뷰 함수 구현 | ✅ commit=False → author 수동 추가 |
로그인 필수 | ✅ @login_required() 적용 |
로그인 후 리디렉션 | ✅ ?next=/create/ 처리 |
템플릿 연결 | ✅ 작성 버튼 및 작성 폼 구성 완료 |
💬 Django의 Form과 인증 시스템을 함께 활용하면, 안전하고 효율적인 사용자 입력 기능을 구현할 수 있습니다!