장고에서는 사용자의 입력을 받아서 데이터베이스에 저장하는 과정을 간단하게 처리할 수 있습니다.
이번 포스팅에서는 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을 사용하면 이 과정을 더 간편하게 만들 수 있습니다.
'Programming > Django' 카테고리의 다른 글
| [Django] Form 처리, 함수형 뷰에서 클래스 기반 뷰(CBV)로 리팩토링하기 (4) | 2025.07.24 |
|---|---|
| [Django] ModelForm으로 폼을 간단히! 그런데 레이블을 잃었다... (1) | 2025.07.24 |
| [Django] ManyToManyField 역참조 출력 오류 해결: post.tags 관련 에러 정리 (4) | 2025.07.23 |
| 🧩 Django 관리자에서 Post 모델 꾸미기 - PostAdmin 설정하기 (3) | 2025.07.23 |
| 🛠 Django 관리자(admin) 페이지에 모델 등록하기 (0) | 2025.07.23 |