기술블로그-Django편
🛠 Django 기본 Form(as_p)을 간접 커스터마이징하는 방법
Chansman
2025. 5. 9. 14:05
🛠 Django 기본 Form(as_p)을 간접 커스터마이징하는 방법
🎯 목표
Django의 기본 form.as_p 구조를 사용하면서도 Bootstrap 스타일 적용, 동적 버튼/제목 변경 등 UI를 개선하는 방법을 익히고, blog_form.html 템플릿과 View 코드의 관계를 이해합니다.
✅ 1. 템플릿 구조 (blog_form.html)
{% extends 'base.html' %}
{% block content %}
<h1 class="mt-3">블로그 {{ sub_title }}</h1>
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<button class="btn btn-primary">{{ btn_name|default:"저장" }}</button>
</form>
{% endblock %}
🔍 주요 특징
- form.as_p: Django의 기본 HTML 렌더링 방식. 각 폼 필드를 <p> 태그로 감싸서 출력
- {{ sub_title }}: View에서 전달된 값에 따라 "작성", "수정" 등의 문구 표시
- {{ btn_name|default:"저장" }}: 버튼 이름을 동적으로 설정. 값이 없으면 "저장"이 기본값
✅ 2. View 코드에서 context 동적 전달
✏️ BlogCreateView 예시
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['sub_title'] = '작성'
context['btn_name'] = '생성'
return context
✏️ BlogUpdateView 예시
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['sub_title'] = '수정'
context['btn_name'] = '수정'
return context
📌 역할 요약
- sub_title: 템플릿의 <h1> 제목에 반영됨
- btn_name: 버튼의 텍스트에 반영됨
- 같은 템플릿(blog_form.html)을 사용하지만 View에 따라 보여지는 UI는 다르게 구성됨
✅ 3. Bootstrap 스타일 적용: 간접 커스터마이징
form.as_p는 직접 스타일 조정이 어려움 → 그래서 아래 방법 사용
1️⃣ JavaScript로 클래스 강제 부여 (form-js.html)
<script>
document.querySelectorAll('select, input, textarea').forEach(function(ele){
ele.classList.add('form-control');
});
</script>
- 모든 입력 요소에 form-control 클래스를 자동 부여
- Bootstrap UI 자동 적용됨 (단, 클라이언트 렌더링 기준)
2️⃣ 또는 widgets 방식으로 스타일 부여 (Form 클래스에서)
class BlogForm(forms.ModelForm):
class Meta:
model = Blog
fields = ['title', 'content']
widgets = {
'title': forms.TextInput(attrs={'class': 'form-control'}),
'content': forms.Textarea(attrs={'class': 'form-control'}),
}
🧩 정리: 직접 vs 간접 커스터마이징
방식 설명 유연성
form.as_p | Django 기본 구조 출력 | ❌ 낮음 |
JS로 class 추가 | form-control 자동 부여 | ✅ 중간 |
widgets 설정 | 폼 클래스 내에서 직접 Bootstrap 적용 | ✅ 중간 |
form.field 직접 출력 | 완전 수동 제어 (필드, 라벨, 에러까지) | ✅ 최고 |
✅ 최종 요약
- form.as_p는 직접 커스터마이징은 불가하지만, 외부에서 간접적으로 스타일 적용 가능
- 템플릿에 보여지는 제목과 버튼 문구는 View의 get_context_data()로 동적 설정
- 하나의 템플릿에서 Create/Update 등 다양한 뷰를 유연하게 처리할 수 있는 구조
💡 간단하게 시작하고 싶다면 form.as_p + JS 스타일, 세부 제어가 필요하면 form.field 방식으로 전환하세요!