Django ModelForm을 활용한 사용자 추가 구현

Django에서 ModelForm은 Form과 Model을 결합한 도구로, 데이터베이스에 대한 생성 및 수정 작업과 입력값 검증, HTML 폼 태그 생성을 간편하게 처리합니다. 예를 들어, 학생 정보(이름, 나이, 취미, 이메일, 전화번호, 주소, 등록일 등)를 입력받는 페이지를 개발할 때, 전통적인 방식은 프론트엔드에서 각 필드를 하나씩 나열하고, 백엔드에서 모든 입력을 수신하여 수동으로 유효성 검사를 수행한 후 객체를 생성하는 것입니다. 이 과정은 번거롭고 오류가 발생하기 쉽습니다. ModelForm을 사용하면 코드 중복을 줄이고 유지보수를 개선할 수 있습니다.

ModelForm을 사용한 사용자 추가 구현

1. ModelForm 클래스 정의

ModelForm은 모델 필드를 기반으로 자동으로 폼 필드를 생성하며, 추가 검증 규칙이나 스타일을 적용할 수 있습니다. 다음 예제는 UserInfo 모델을 기반으로 한 ModelForm입니다.

# form.py
from app01.utils.bootstrap import BootStrapModelForm
from app01 import models
from django import forms

class UserModelForm(BootStrapModelForm):
    # 사용자명에 최소 길이 검증 추가
    username = forms.CharField(min_length=3, label="사용자명")

    class Meta:
        model = models.UserInfo
        fields = ["username", "password", "age", 'account', 'create_time', "gender", "depart"]
        # 각 필드에 공통 CSS 클래스 추가 (BootStrapModelForm 상속 시 자동 처리)
        # 필요시 widgets로 개별 제어 가능:
        # widgets = {
        #     "password": forms.PasswordInput(attrs={"class": "form-control"}),
        # }

참고: BootStrapModelForm는 기본적으로 모든 필드에 class="form-control"을 추가하는 부모 클래스입니다. 주석 처리된 __init__ 메서드는 이를 수동으로 구현한 예시이며, 상속 방식으로 대체되었습니다.

2. 뷰 함수 구현

뷰 함수는 GET과 POST 요청을 처리합니다. GET 요청 시 빈 폼을 렌더링하고, POST 요청 시 데이터 검증 후 저장합니다. 유효성 검사에 실패하면 폼에 오류 메시지를 포함하여 다시 렌더링합니다.

# views.py
from django.shortcuts import render, redirect
from app01.models import UserInfo
from app01.utils.form import UserModelForm

def add_user(request):
    """ModelForm 기반 사용자 추가"""
    if request.method == "GET":
        form = UserModelForm()
        return render(request, 'user_add.html', {"form": form})

    # POST 요청 처리
    form = UserModelForm(data=request.POST)
    if form.is_valid():
        # 검증 성공: 데이터베이스에 저장
        # cleaned_data 예: {'username': 'test', 'password': '123', 'age': 25, ...}
        form.save()  # 내부적으로 모델 객체 생성 및 저장
        return redirect('/user/list/')

    # 검증 실패: 폼과 오류를 템플릿에 전달
    return render(request, 'user_add.html', {"form": form})

form.save()는 ModelForm의 기본 동작으로, 모델의 create() 메서드를 대체하여 객체를 저장합니다.

3. 템플릿 구성

템플릿에서는 form 객체를 반복하며 각 필드의 라벨, 입력 요소, 오류 메시지를 출력합니다. novalidate 속성은 브라우저 기본 검증을 비활성화하여 Django의 검증 결과가 표시되도록 합니다.

<!-- user_add.html -->
<form method="post" novalidate>
    {% csrf_token %}

    {% for field in form %}
        <div class="form-group">
            <label>{{ field.label }}</label>
            {{ field }}
            <span style="color: red;">{{ field.errors.0 }}</span>
        </div>
    {% endfor %}

    <button type="submit" class="btn btn-primary">제출</button>
</form>

이 구조는 ModelForm이 제공하는 검증 오류를 사용자에게 즉시 표시하며, Bootstrap 스타일과 결합하여 깔끔한 UI를 유지합니다.

태그: Django ModelForm 폼 검증 bootstrap 사용자 관리

7월 18일 23:45에 게시됨