본문 바로가기
Programming/Django

[Django] Form을 통해 사용자 리뷰 저장하기 (feat. Model 연결)

by Mandy's 2025. 7. 24.

장고에서는 사용자의 입력을 받아서 데이터베이스에 저장하는 과정을 간단하게 처리할 수 있습니다.

이번 포스팅에서는 Form과 Model을 연결해서 사용자 리뷰를 저장하는 과정을 하나씩 살펴보겠습니다.


✅ 목표

  • 사용자로부터 이름, 리뷰 내용, 평점을 입력받는다
  • 유효성 검사를 한다
  • models.py의 Review 모델에 데이터를 저장한다
  • 성공하면 /thank-you 페이지로 리디렉션한다

📌 1. 모델 만들기 (models.py)

from django.db import models

class Review(models.Model):
    user_name = models.CharField(max_length=100)
    review_text = models.TextField()
    rating = models.IntegerField()
  • user_name: 이름 입력 (최대 100자)
  • review_text: 리뷰 내용 (자유롭게 작성 가능)
  • rating: 평점 (1~5 같은 숫자)

💡 makemigrations, migrate 꼭 해주세요!

python manage.py makemigrations
python manage.py migrate

🧾 2. 폼 만들기 (forms.py)

from django import forms

class ReviewForm(forms.Form):
    user_name = forms.CharField(
        label="Your Name", 
        max_length=100,
        error_messages={
            "required": "Your name must not be empty!",
            "max_length": "Please enter a shorter name!"
        }
    )
    review_text = forms.CharField(widget=forms.Textarea)
    rating = forms.IntegerField(min_value=1, max_value=5)
  • 사용자 입력 폼을 forms.Form 클래스로 정의
  • 각 필드마다 라벨, 최대 길이, 에러 메시지 등을 설정
  • 평점은 1~5 사이의 정수만 허용

🧠 3. 뷰에서 데이터 처리 (views.py)

from django.http import HttpResponseRedirect
from django.shortcuts import render

from .forms import ReviewForm
from .models import Review

def review(request):
    if request.method == 'POST':
        form = ReviewForm(request.POST)

        if form.is_valid():
            review = Review(
                user_name=form.cleaned_data['user_name'],
                review_text=form.cleaned_data['review_text'],
                rating=form.cleaned_data['rating']
            )
            review.save()
            return HttpResponseRedirect("/thank-you")
    else:
        form = ReviewForm()

    return render(request, "reviews/review.html", {
        "form": form
    })

def thank_you(request):
    return render(request, "reviews/thank_you.html")

핵심 포인트

  • request.method == 'POST' : 사용자가 폼 제출했을 때만 실행
  • form.is_valid() : 입력 값 유효성 검사
  • form.cleaned_data : 사용자가 입력한 값 추출
  • .save() : 모델 인스턴스를 DB에 저장
  • HttpResponseRedirect : 성공 후 다른 페이지로 이동

💻 4. 템플릿 (HTML 폼)

templates/reviews/review.html:

{% load static %}
<!DOCTYPE html>
<html>
<head>
    <title>Review</title>
    <link rel="stylesheet" href="{% static 'reviews/styles.css' %}">
</head>
<body>
    <form action="/" method="POST">
        {% csrf_token %}
        <div class="form-control {% if form.user_name.errors %} errors{% endif %}">
            {{ form.user_name.label_tag }}
            {{ form.user_name }}
            {{ form.user_name.errors }}
        </div>
        <div class="form-control">
            {{ form.review_text.label_tag }}
            {{ form.review_text }}
        </div>
        <div class="form-control">
            {{ form.rating.label_tag }}
            {{ form.rating }}
        </div>
        <button type="submit">Send</button>
    </form>
</body>
</html>

✅ csrf_token은 CSRF 보안을 위해 반드시 필요합니다.


🎨 5. 스타일 적용 (CSS)

static/reviews/styles.css에 작성한 스타일은 사용자 경험을 개선해줍니다. 


🎉 결과

  • 잘못된 입력 시 에러 메시지가 표시됩니다.
  • 입력이 완료되면 DB에 저장되고 /thank-you 페이지로 이동됩니다.
  • admin 페이지를 통해 저장된 리뷰도 확인할 수 있습니다.

🚀 마무리

Django의 Form과 Model을 잘 연결하면 유효성 검사와 DB 저장이 정말 간단해집니다.

나중에는 ModelForm을 사용하면 이 과정을 더 간편하게 만들 수 있습니다.