폼이나 데이터베이스에 위치 정보를 담는 필드를 추가해야 할 때 CharField를 사용할 수도 있지만, 이는 그다지 좋은 방법이 아닙니다. Django에는 국가 필드를 손쉽게 구현할 수 있게 해주는 서드파티 패키지인 django-countries가 있습니다. 이 글에서는 django-countries를 활용해 Django에 국가(Country) 필드를 추가하는 방법을 단계별로 살펴보겠습니다.
사전 준비
먼저 Django 프로젝트와 앱을 생성합니다. 그다음 앱을 INSTALLED_APPS에 등록하고 URL 설정을 마쳐주세요.
이제 django-countries 모듈을 설치합니다:
pip install django-countries
settings.py 파일에 다음 코드를 추가합니다:
INSTALLED_APPS += [ 'django_countries']
예제
1. urls.py 설정
앱의 urls.py 파일입니다:
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name="home"),
]
먼저 위와 같이 URL 라우팅을 설정합니다.
2. views.py 작성
views.py 파일입니다:
from django.shortcuts import render
from django import forms
from .models import Data
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})
여기서는 ModelForm을 기반으로 폼을 하나 생성하고, 뷰의 GET 요청 핸들러에서 해당 폼을 렌더링했습니다. POST 요청이 들어오면 유효성 검사를 통과한 폼 데이터를 저장하도록 처리했습니다.
3. 템플릿 작성
앱 디렉터리 안에 templates 폴더를 만들고, 그 안에 home.html 파일을 생성합니다. home.html의 내용은 다음과 같습니다:
<!DOCTYPE html>
<html>
<head>
<title>
TUT
</title>
<style>
</style>
</head>
<body>
<h2>FORM</h2>
<form action="/" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Submit">
</form>
</body>
</html>
위 코드는 폼을 화면에 보여주는 프런트엔드 HTML입니다.
4. models.py에 국가 필드 추가
models.py 파일입니다:
from django.db import models
from django_countries.fields import CountryField
# Create your models here.
class Data(models.Model):
Name=models.CharField(max_length=100)
salary = models.CharField(max_length=20)
country_of_work = CountryField(blank=True)
여기서는 국가 데이터를 저장할 수 있는 country 필드를 포함한 모델을 생성했습니다. CountryField를 사용하면 전 세계 국가 목록이 드롭다운 형태로 자동으로 제공되므로, 일일이 국가명을 입력받는 CharField보다 훨씬 편리하고 데이터의 일관성도 유지할 수 있습니다.
마이그레이션 실행
모델 작성이 끝났다면 아래 명령어로 마이그레이션을 생성하고 데이터베이스에 적용합니다:
python manage.py makemigrations python manage.py migrate
이것으로 모든 설정이 완료되었습니다. 이제 개발 서버를 실행하고 브라우저에서 페이지를 열어 결과를 확인해 보세요.
출력 결과
