Django

Chapter 4-3 Django 작성 기능 만들기 with Form

Chansman 2025. 5. 7. 10:29

📝 Django Forms로 블로그 글 작성 기능 만들기

💡 Django Forms의 핵심 역할

  1. HTML <form> 자동 생성
  2. 데이터 유효성 검사 (Validation)
  3. 모델 인스턴스 저장 및 업데이트

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과 인증 시스템을 함께 활용하면, 안전하고 효율적인 사용자 입력 기능을 구현할 수 있습니다!