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

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>
태그의id
는id_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의 필드와 위젯은 데이터를 처리하고 검증하며, 사용자 인터페이스를 구성하는 데 핵심적인 역할을 합니다. 기본 제공되는 필드와 위젯 외에도, 필요에 따라 커스터마이징하여 프로젝트에 적합한 폼을 설계할 수 있습니다.
다음 글에서는 유효성 검사와 폼 커스터마이징에 대해 더 깊이 알아보겠습니다.
Add a New Comment