TIL(25.1.20)

채채·2025년 1월 20일

Today I Learned

목록 보기
60/75

accounts를 만드는 4가지 방법



1. HTML 직접 사용 (순수 HTML + views 직접 처리)

Django의 기본 폼 기능을 사용하지 않고, HTML에서 직접 form 태그로 사용자 입력을 받고, 뷰에서 데이터를 수동으로 처리하는 방식.

#accounts/templates/register.html

<form method="post">
    {% csrf_token %}
    <label>Username:</label>
    <input type="text" name="username">
    
    <label>Password:</label>
    <input type="password" name="password">
    
    <input type="submit" value="Register">
</form>
#accounts/views.py

from django.contrib.auth.models import User
from django.shortcuts import render, redirect
from django.contrib.auth import login

def register(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = User.objects.create_user(username=username, password=password)
        login(request, user)
        return redirect('home')
    return render(request, 'register.html')
  • 장점: 간단하고 직접적인 구현
  • 단점: 폼 검증이 부족하고, 보안 취약점이 있을 수 있음



2. forms.Form 사용 (커스텀 폼 작성)

Django의 forms.Form 클래스를 사용하여 사용자 입력을 검증하고 처리할 수 있음.

#accounts/forms.py
from django import forms

class RegisterForm(forms.Form):
    username = forms.CharField(max_length=150)
    password = forms.CharField(widget=forms.PasswordInput)

#accounts/views.py
from django.contrib.auth.models import User
from django.shortcuts import render, redirect
from .forms import RegisterForm
from django.contrib.auth import login

def register(request):
    if request.method == 'POST':
        form = RegisterForm(request.POST)
        if form.is_valid():
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']
            user = User.objects.create_user(username=username, password=password)
            login(request, user)
            return redirect('home')
    else:
        form = RegisterForm()
    return render(request, 'register.html', {'form': form})
#accounts/templates/register.html

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Register">
</form>
  • 장점: 유효성 검사 제공 (form.is_valid()) / 사용자 지정 폼 검증 가능
  • 단점: 기본적인 회원가입 기능을 직접 처리해야 함



3. UserCreationForm 사용 (Django 기본 폼 활용)

Django에서 제공하는 기본 UserCreationForm을 사용하여 회원가입을 처리하는 방식.

# accounts/views.py
from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import render, redirect
from django.contrib.auth import login

def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, user)
            return redirect('home')
    else:
        form = UserCreationForm()
    return render(request, 'register.html', {'form': form})
#accounts/templates/register.html
  
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Sign Up">
</form>
  • 장점:

    • Django 기본 제공, 비밀번호 유효성 검사 포함
    • 회원가입 로직이 이미 구현되어 있음
  • 단점:

    • 기본 폼 디자인을 커스터마이징하려면 추가 작업 필요



4. Class-based View (CBV) 사용

Django의 클래스 기반 뷰(CBV)를 사용하여 보다 구조화된 회원가입 처리를 수행.

#accounts/views.py
from django.contrib.auth.forms import UserCreationForm
from django.urls import reverse_lazy
from django.views.generic import CreateView

class RegisterView(CreateView):
    form_class = UserCreationForm
    template_name = 'register.html'
    success_url = reverse_lazy('home')
#accounts/urls.py
    
from django.urls import path
from .views import RegisterView

urlpatterns = [
    path('register/', RegisterView.as_view(), name='register'),
]
#accounts/templates/register.html
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Sign Up">
</form>
  • 장점:
    • 코드 재사용성이 높고 유지보수 용이
    • CreateView 활용으로 기본적인 등록 처리 자동화
  • 단점:
    • 뷰 로직이 자동화되어 세부적인 컨트롤이 어려울 수 있음



* 비교 요약

방법장점단점추천 용도
HTML 직접 사용간단하고 빠르게 구현 가능유효성 검사 및 보안 취약단순한 테스트용
forms.Form 사용커스텀 검증 및 관리 용이기본적인 사용자 관리 기능 직접 구현 필요사용자 지정 검증이 필요한 경우
UserCreationForm 사용기본 검증 및 비밀번호 검증 자동 제공기본 폼 커스터마이징이 필요함간단한 회원가입 기능
CBV 사용코드 구조화 및 유지보수 용이세부적인 컨트롤 어려움대규모 프로젝트 및 재사용이 필요한 경우
profile
화이팅

0개의 댓글