웹사이트를 개발하다 보면 급여, 수수료, 수입처럼 금액(money)과 관련된 데이터를 다뤄야 하는 경우가 자주 있습니다. Django는 기본적으로 정수형(IntegerField)이나 소수형(DecimalField) 필드를 제공하지만, 통화 단위 표시나 환율 처리 같은 기능은 지원하지 않아 원하는 대로 동작하지 않을 때가 많습니다.
이런 문제를 해결하기 위해 서드파티 라이브러리인 django-money를 사용하면 모델에 통화 정보까지 포함된 Money 필드를 손쉽게 추가할 수 있습니다. 이번 글에서는 django-money를 설치하고 실제 프로젝트에 적용하는 과정을 단계별로 살펴보겠습니다.
1. 프로젝트 및 앱 생성
먼저 새로운 Django 프로젝트와 앱을 생성합니다. 여기서는 프로젝트 이름을 MoneyFieldDemo, 앱 이름을 myapp으로 지정했습니다.
django-admin startproject MoneyFieldDemo cd MoneyFieldDemo python manage.py startapp myapp
그다음 urls.py 설정과 INSTALLED_APPS에 앱을 등록하는 등 기본 환경설정을 마쳐줍니다.
2. django-money 설치
pip 명령어로 django-money 라이브러리를 설치합니다.
pip install django-money
설치가 완료되면 settings.py의 INSTALLED_APPS에 다음 한 줄을 추가합니다.
INSTALLED_APPS += ["djmoney"]
3. URL 설정 (urls.py)
앱의 urls.py에 아래 코드를 작성해 화면을 렌더링할 URL 엔드포인트를 정의합니다.
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name="home"),
]여기서는 루트 경로('')로 접속했을 때 home 뷰가 실행되도록 간단히 설정했습니다.
4. 프론트엔드 템플릿 (home.html)
templates 폴더 안에 home.html 파일을 만들고 아래와 같이 작성합니다.
<!DOCTYPE html>
<html>
<head>
<title>
TUT
</title>
</head>
<body>
<h2>Hi</h2>
<form action="/" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Submit">
</form>
</body>
</html>이 HTML 파일이 사용자에게 보여지는 프론트엔드 역할을 하며, 폼 데이터를 POST 방식으로 전송합니다.
5. 모델 정의 (models.py)
models.py에 다음과 같이 MoneyField를 포함한 모델을 작성합니다.
from django.db import models
from djmoney.models.fields import MoneyField
# Create your models here.
class Data(models.Model):
Name = models.CharField(max_length=100)
salary = MoneyField(max_digits=14, decimal_places=2,
default_currency='USD') # 이것이 Money 필드입니다여기서는 직원 이름(Name)과 달러(USD) 기준의 급여(salary) 두 값을 저장하는 모델을 만들었습니다. max_digits=14는 전체 자릿수, decimal_places=2는 소수점 이하 자릿수를 의미하며, default_currency='USD'를 통해 기본 통화를 미국 달러로 지정했습니다. 필요에 따라 'KRW', 'EUR' 등 다른 통화 코드로 변경할 수 있습니다.
6. 뷰 작성 (views.py)
views.py에는 폼을 생성하고 GET/POST 요청을 처리하는 코드를 추가합니다.
from django.shortcuts import render
from django import forms
from .models import Data
# Create your views here.
class SalaryForm(forms.ModelForm):
class Meta:
model = Data
fields = "__all__"
def home(request):
if request.method == 'POST':
form = SalaryForm(request.POST)
if form.is_valid():
form.save()
else:
form = SalaryForm()
return render(request, 'home.html', {'form': form})views.py에는 특별한 로직이 없습니다. 모델 기반으로 폼(ModelForm)을 만들고, 이를 템플릿에 렌더링한 뒤 POST 요청이 들어오면 유효성 검사를 거쳐 데이터를 저장하도록 구현했습니다.
실행 결과
모든 설정을 마친 후 서버를 실행하면 아래와 같이 급여 입력란에 통화 정보(USD)가 함께 표시되는 폼을 확인할 수 있습니다.
