여름의 서재

[Django] User model 커스텀하기 본문

Skill/Django

[Django] User model 커스텀하기

엉아_ 2021. 10. 22. 00:15
728x90

💡 User 모델을 왜 커스텀해야할까?

1. 일부 프로젝트에서는 Django의 내장 User 모델이 제공하는 인증 요구사항이 적절하지 않을 수 있음

ex) username 대신 email을 식별 토큰으로 사용하는 것이 더 적합한 사이트

 

2. Django는 기본 사용자 보델이 충분하더라도, 커스텀 유저 모델을 설정하는 것을 강력하게 권장!

(프로젝트에서 첫 migrations, migrate를 하기 전에 커스텀 유저 모델을 만들어 놔야함!! 중간에 변경 X)

 

🔧 Custom User 모델 만들기

1. accounts/models.py

: AbstractUser을 상속받아 커스텀 User 모델을 만든다.

from django.contrib.auth.models import AbstractUser

# Create your models here.
class User(AbstractUser):
    pass

 

2. settings.py

: django가 내가 새로 만든 커스텀 User 모델을 사용하도록 AUTH_USER_MODEL을 변경해준다.

AUTH_USER_MODEL = 'accounts.User'

 

3. accounts/admin.py

: admin site에 커스텀 User 모델을 등록한다.

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User

# Register your models here.
admin.site.register(User, UserAdmin)

 

4. accounts/views.py

: signup, update 함수에서 UsercreationForm과 UserchangeForm을 사용하고 있다면, 커스텀 User 모델을 이용해 커스텀 form을 만들어서 바꿔줘야 한다.

( UsercreationForm과 UserchangeForm은 기존의 User 모델을 사용하는 form이기 때문!)

# accounts/forms.py

from django.contrib.auth.forms import UserChangeForm, UserCreationForm
from django.contrib.auth import get_user_model

class CustomUserChangeForm(UserChangeForm):

    class Meta:
        model = get_user_model()
        fields = ('email', 'first_name', 'last_name',)


class CustomUserCreationForm(UserCreationForm):

    class Meta(UserCreationForm.Meta):
        model = get_user_model()
        fields = UserCreationForm.Meta.fields + ('email',)

-> 이때! User 모델을 직접 참조하지 않고 get_user_model()을 이용해야 함!!

 

# accounts/views.py

@require_http_methods(['GET', 'POST'])
def signup(request):
    if request.user.is_authenticated:
        return redirect('articles:index')

    if request.method == 'POST':
        form = CustomUserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            auth_login(request, user)
            return redirect('articles:index')
    else:
        form = CustomUserCreationForm()
    context = {
        'form': form,
    }
    return render(request, 'accounts/signup.html', context)
    
    
@login_required
@require_http_methods(['GET', 'POST'])
def update(request):
    if request.method == 'POST':
        form = CustomUserChangeForm(request.POST, instance=request.user)
        if form.is_valid():
            form.save()
            return redirect('articles:index')
    else:
        form = CustomUserChangeForm(instance=request.user)
    context = {
        'form': form,
    }
    return render(request, 'accounts/update.html', context)

 

Comments