Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Django – 단일 뷰에서 여러 폼 동시에 처리하는 방법

Django로 웹 애플리케이션을 개발하다 보면 하나의 함수 또는 뷰(View) 안에서 여러 개의 폼을 동시에 처리해야 하는 경우가 자주 발생합니다. 이 글에서는 하나의 뷰에서 두 개의 폼을 동시에 다루는 방법을 예제와 함께 살펴보겠습니다. 이 기법은 실무에서 매우 유용하며, 원리를 이해하면 세 개 이상의 폼도 손쉽게 확장할 수 있습니다.

사전 준비: 프로젝트 및 앱 설정

먼저 Django 프로젝트와 앱을 생성합니다. 여기서는 프로젝트 이름을 "multipleFormHandle", 앱 이름을 "formhandlingapp"으로 지정했습니다.

이후 다음과 같은 기본 설정을 진행합니다.

  • settings.pyINSTALLED_APPS에 생성한 앱을 등록합니다.
  • 프로젝트의 urls.py에 앱의 URL을 포함(include)합니다.
  • 앱 디렉터리 안에 forms.py 파일과 templates 폴더를 만들고, templates 폴더에 home.html을 추가합니다.

그리고 여러 폼을 한 번에 처리할 수 있게 도와주는 multi_form_view 라이브러리를 설치합니다.

pip install multi_form_view

예제 구현

urls.py – 라우팅 설정

앱의 urls.py를 아래와 같이 작성합니다. 클래스 기반 뷰인 SchoolData를 홈 화면에 연결합니다.

from django.urls import path, include
from . import views

urlpatterns = [
    path('', views.SchoolData.as_view(), name='home'),
]

models.py – 데이터 모델 정의

폼 데이터를 데이터베이스에 저장하기 위해 학생(StudentData)과 교사(TeacherData) 두 개의 모델을 생성합니다.

from django.db import models

class StudentData(models.Model):
    name = models.CharField(max_length=100)
    standard = models.CharField(max_length=100)
    section = models.CharField(max_length=100)

class TeacherData(models.Model):
    name = models.CharField(max_length=100)
    ClassTeacherOF = models.CharField(max_length=100)
    Salary = models.CharField(max_length=100)

forms.py – 모델 폼 작성

앞서 만든 모델을 기반으로 두 개의 ModelForm을 정의합니다. 이 폼들은 뷰를 통해 프런트엔드에 렌더링됩니다.

from django import forms
from .models import TeacherData, StudentData

class StudentForm(forms.ModelForm):
    class Meta:
        model = StudentData
        fields = "__all__"

class TeacherForm(forms.ModelForm):
    class Meta:
        model = TeacherData
        fields = "__all__"

home.html – 템플릿 작성

템플릿에서는 하나의 <form> 태그 안에 두 개의 Django 폼을 함께 렌더링하고, 하나의 제출 버튼만 사용합니다.

<!DOCTYPE html>
<html>
<head>
    <title>tut</title>
</head>
<body>
    <form method="post" enctype="multipart/form-data">
        {% csrf_token %}

        <label><h3>Teacher</h3></label>
        <!-- 뷰에서 전달받은 교사 폼 -->
        {{ forms.teacher_form.as_p }}

        <label><h3>Student</h3></label>
        <!-- 뷰에서 전달받은 학생 폼 -->
        {{ forms.student_form.as_p }}

        <input type="submit" value="submit" />
    </form>
</body>
</html>

여기서는 개념과 구현 방법에 집중하기 위해 별도의 스타일링은 적용하지 않았습니다. 필요에 따라 CSS를 추가해 디자인을 개선할 수 있습니다.

views.py – MultiModelFormView 활용

핵심 부분입니다. multi_form_view 패키지가 제공하는 MultiModelFormView를 상속받아 여러 폼을 하나의 뷰에서 처리합니다.

from django.shortcuts import render
from .forms import StudentForm, TeacherForm
from django.views.generic.list import ListView
from django.urls import reverse
from multi_form_view import MultiModelFormView

class SchoolData(MultiModelFormView):
    form_classes = {
        'student_form': StudentForm,
        'teacher_form': TeacherForm,
    }
    template_name = 'home.html'

    def get_success_url(self):
        return reverse('home')

    def forms_valid(self, forms):
        student = forms['student_form'].save(commit=False)
        teacher = forms['teacher_form'].save(commit=False)
        return super(SchoolData, self).forms_valid(forms)

코드를 살펴보면 다음과 같이 동작합니다.

  • form_classes: 렌더링할 두 개의 폼(학생 폼, 교사 폼)을 딕셔너리 형태로 정의합니다.
  • template_name: 화면에 표시할 HTML 템플릿을 지정합니다.
  • get_success_url: 폼 제출이 성공했을 때 이동할 URL을 지정합니다.
  • forms_valid: 두 폼의 유효성 검사가 모두 통과했을 때 호출되며, 각 폼의 데이터를 저장(commit=False로 객체를 먼저 생성)한 후 추가 로직을 넣을 수 있습니다.

실행 결과

서버를 실행하고 홈 페이지에 접속하면 하나의 페이지 안에 교사 폼과 학생 폼이 함께 표시되며, 제출 버튼 하나로 두 폼의 데이터가 동시에 유효성 검사를 거쳐 저장됩니다.

Django – 단일 뷰에서 여러 폼 동시에 처리하는 방법