Django Forms의 핵심은 필드(Field)위젯(Widget)입니다. 필드는 입력 데이터를 검증하고 처리하는 역할을 하며, 위젯은 해당 필드를 렌더링할 HTML 요소를 정의합니다. 이 글에서는 주요 필드와 위젯, 그리고 커스터마이징 방법을 자세히 살펴보겠습니다.

1. Django Forms 필드

A diagram showcasing Django Forms Fields and Widgets, highlighting CharField, EmailField, and their corresponding widgets like TextInput, EmailInput

1.1 필드란?

필드는 Django Forms에서 데이터를 정의하고 검증하는 기본 구성 요소입니다.

  • 사용자가 입력한 데이터를 받아 cleaned_data로 저장하기 전에 검증합니다.
  • 각 필드는 HTML 입력 유형과 매핑됩니다.
주요 필드 종류
필드 설명 예제 위젯
CharField 문자열 입력 필드 TextInput
EmailField 이메일 형식 입력 필드 EmailInput
IntegerField 정수 입력 필드 NumberInput
DateField 날짜 입력 필드 DateInput
ChoiceField 옵션 선택 필드 Select
BooleanField 체크박스 입력 필드 CheckboxInput
FileField 파일 업로드 필드 FileInput
필드 기본 사용법
from django import forms

class ExampleForm(forms.Form):
    name = forms.CharField(max_length=50, required=True, label="Your Name")
    email = forms.EmailField(required=True, label="Your Email")
    age = forms.IntegerField(required=False, min_value=1, label="Your Age")

2. Django Forms 위젯

2.1 위젯이란?

위젯은 Django Forms에서 각 필드가 HTML로 렌더링될 때 사용하는 요소입니다.

  • 필드의 HTML 태그와 속성을 정의합니다.
  • 예: CharField는 기본적으로 TextInput 위젯을 사용합니다.
주요 위젯 종류
위젯 렌더링되는 HTML 태그 사용 필드
TextInput <input type="text"> CharField
EmailInput <input type="email"> EmailField
NumberInput <input type="number"> IntegerField
DateInput <input type="date"> DateField
Select <select> ChoiceField
CheckboxInput <input type="checkbox"> BooleanField
FileInput <input type="file"> FileField

2.2 필드와 ID 속성

Django Forms는 HTML로 렌더링될 때 각 필드에 고유한 id 속성을 자동으로 추가합니다. 이 속성은 id_<fieldname> 형식으로 생성됩니다.

  • 예: 필드 이름이 name이면 렌더링된 <input> 태그의 idid_name이 됩니다.
  • id 속성은 템플릿에서 다음과 같은 경우 유용합니다:
    • JavaScript: 특정 필드를 선택하여 동적으로 처리.
    • Label 태그: <label for="id_name">로 연결.
예제: 필드와 ID 속성 활용
<form method="post">
    {% csrf_token %}
    <label for="id_name">Name:</label>
    <input type="text" id="id_name" name="name">

    <script>
        document.getElementById('id_name').addEventListener('input', function() {
            console.log(this.value);
        });
    </script>
</form>

3. 필드와 위젯 커스터마이징

3.1 필드 속성 커스터마이징

Django Forms는 attrs를 사용해 HTML 요소의 속성을 변경할 수 있습니다.

예제: 필드 속성 변경
class CustomForm(forms.Form):
    username = forms.CharField(
        max_length=100,
        widget=forms.TextInput(attrs={
            'class': 'form-control',
            'placeholder': 'Enter your username'
        })
    )
    email = forms.EmailField(
        widget=forms.EmailInput(attrs={
            'class': 'form-control',
            'placeholder': 'Enter your email'
        })
    )

3.2 커스텀 위젯 생성

필요에 따라 사용자 정의 위젯을 만들어 사용할 수도 있습니다.

예제: 커스텀 위젯 생성
from django.forms.widgets import TextInput

class CustomTextInput(TextInput):
    template_name = 'custom_widgets/custom_text_input.html'

class CustomForm(forms.Form):
    custom_field = forms.CharField(widget=CustomTextInput())

4. 실전 사례: 스타일링된 폼 만들기

4.1 부트스트랩 적용

부트스트랩과 함께 사용할 때, 각 필드에 class='form-control'을 추가하여 스타일링할 수 있습니다.

예제: 부트스트랩 스타일 폼
class BootstrapForm(forms.Form):
    name = forms.CharField(
        widget=forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Enter your name'})
    )
    email = forms.EmailField(
        widget=forms.EmailInput(attrs={'class': 'form-control', 'placeholder': 'Enter your email'})
    )

4.2 커스텀 CSS와 폼 스타일링

CSS 파일을 추가하여 폼 스타일을 더욱 세부적으로 조정할 수 있습니다.

예제: CSS와 연동된 템플릿
<form method="post">
    {% csrf_token %}
    <div class="form-group">
        <label for="id_name">Your Name</label>
        <input type="text" class="form-control" id="id_name" name="name">
    </div>
    <div class="form-group">
        <label for="id_email">Your Email</label>
        <input type="email" class="form-control" id="id_email" name="email">
    </div>
    <button type="submit" class="btn btn-primary">Submit</button>
</form>

5. 결론

Django Forms의 필드와 위젯은 데이터를 처리하고 검증하며, 사용자 인터페이스를 구성하는 데 핵심적인 역할을 합니다. 기본 제공되는 필드와 위젯 외에도, 필요에 따라 커스터마이징하여 프로젝트에 적합한 폼을 설계할 수 있습니다.

다음 글에서는 유효성 검사와 폼 커스터마이징에 대해 더 깊이 알아보겠습니다.