Django 회원가입 페이지 만들기 (정적 파일 + 폼 커스텀 + 뷰 구현)
Django에서 Bootstrap 기반의 회원가입 페이지를 구현하기 위해 필요한 설정부터 폼 처리, 뷰 구성, 템플릿 작성까지의 전체 흐름을 정리합니다.
✅ 1. 정적 파일(static) 설정
- static 폴더를 프로젝트 루트(manage.py와 같은 위치)에 생성합니다.
- Bootstrap CSS/JS 파일을 다운로드하여 static/css, static/js 경로에 넣습니다.
- settings.py에 다음 설정을 추가합니다:
STATIC_URL = 'static/'
STATIC_DIR = BASE_DIR / 'static'
STATICFILES_DIRS = [STATIC_DIR]
STATIC_ROOT = BASE_DIR / '.static_root'
4.root폴더에 static 만들고 Bootstrap CSS/JS 파일을 다운로드하여 static/css, static/js 경로에 넣습니다.
✅ 2. 회원가입 폼 커스텀 (forms.py)
from django import forms
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm
User = get_user_model()
class SignupForm(UserCreationForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field in ('password1', 'password2'):
self.fields[field].widget.attrs['class'] = 'form-control'
self.fields[field].widget.attrs['placeholder'] = 'password'
self.fields[field].label = '비밀번호' if field == 'password1' else '비밀번호 확인'
class Meta(UserCreationForm.Meta):
model = User
fields = ('email', 'nickname')
labels = {'email': '이메일', 'nickname': '닉네임'}
widgets = {
'email': forms.EmailInput(attrs={'placeholder': 'example@example.com', 'class': 'form-control'}),
'nickname': forms.TextInput(attrs={'placeholder': '닉네임', 'class': 'form-control'})
}
✅ 3. 템플릿 디렉토리 설정
settings.py의 TEMPLATES 항목에서 DIRS 경로를 지정합니다:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [...],
},
},
]
✅ 4. 회원가입 뷰 구현 (views.py)
from django.shortcuts import render
from django.views.generic import FormView
from django.urls import reverse_lazy
from member.forms import SignupForm
class SignupView(FormView):
template_name = 'auth/signup.html'
form_class = SignupForm
def form_valid(self, form):
user = form.save()
return render(self.request, 'auth/signup_done.html', {'user': user})
✅ 5. base 템플릿 구성
<!-- templates/base.html -->
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Pystagram</title>
<link rel="stylesheet" href="{% static 'css/bootstrap.css' %}">
</head>
<body>
<div class="container">
{% block content %}{% endblock %}
</div>
<script src="{% static 'js/bootstrap.bundle.js' %}"></script>
</body>
</html>
✅ 6. 회원가입 페이지 템플릿 (signup.html)
<!-- templates/auth/signup.html -->
{% extends 'base.html' %}
{% block content %}
<div>
<h1 class="title">회원가입</h1>
<form method="POST">
{% csrf_token %}
{% for field in form %}
<div class="form-group row mb-2">
<label class="form-label col-md-2" for="{{ field.auto_id }}">{{ field.label }}</label>
<div class="col-md-10">
{{ field }}
</div>
{% for error in field.errors %}
<span class="text-danger">{{ error }}</span>
{% endfor %}
</div>
{% endfor %}
{% for error in form.non_field_errors %}
<p class="text-danger">{{ error }}</p>
{% endfor %}
<button class="btn btn-primary">회원가입</button>
</form>
</div>
{% endblock %}
✅ 7. URL 설정
# config/urls.py
from django.contrib import admin
from django.urls import path
from member import views as member_views
urlpatterns = [
path('admin/', admin.site.urls),
path('signup/', member_views.SignupView.as_view(), name='signup'),
]
✅ 8. 회원가입 완료 템플릿 (signup_done.html)
<!-- templates/auth/signup_done.html -->
{% extends 'base.html' %}
{% block content %}
<div class="col-8 offset-2">
<h1>회원가입이 거의 완료되었습니다.</h1>
<p>
이메일 인증을 하여 회원가입을 완료해주세요.<br>
({{ user.email }})
</p>
</div>
{% endblock %}
🎯 마무리 체크리스트
- static 디렉토리 설정 및 Bootstrap 파일 추가
- 회원가입 폼 SignupForm 작성
- 템플릿 디렉토리 설정
- 뷰(View) 구현 (FormView + form_valid)
- 회원가입 화면 템플릿 작성 (signup.html)
- 회원가입 완료 템플릿 작성 (signup_done.html)
- URL 설정 완료
이 구조를 기반으로 이메일 인증, 로그인 연동, 마이페이지 등으로 확장 가능합니다. 다음 포스트에서는 이메일 인증 로직을 추가해보겠습니다! 📩
'Django' 카테고리의 다른 글
Chapter 8-5 Django 이메일 인증을 위한 SMTP 설정 가이드 (0) | 2025.05.12 |
---|---|
Chapter 8-4 환경변수 관리와 python-dotenv 사용법 (0) | 2025.05.12 |
Chapter 8-2 Django에서 커스텀 유저 모델 만들기 (AbstractBaseUser 활용) (0) | 2025.05.12 |
Chapter 8-1 [인스타그램] 회원가입 및 로그인 기능 만들기 (0) | 2025.05.12 |
🚀 Django REST Framework (DRF) 개요 & API 개발 정보 ( 라이브세션 1일차 강의자료 ) (0) | 2025.05.12 |