Django User모델 확장하기

User 모델과 1:1 연결
기본 제공되는 User모델에 자신이 원하는 유저 정보를 추가하여 프로필을 구현하고 싶을 때 사용한다.
from django.db import models
from django.contrib.auth.models import User

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    profile_image = models.ImageField(null=True) 
      name = models.CharField(max_length=50, blank=True, null=True)
다음과 같이 기본 제공되는 User모델과 1:1로 연결하여 추가 정보를 입력한다.
from django.db.models.signals import post_save
from django.dispatch import receiver

...

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()
리시버 데코레이션을 사용해서 User 가 생성될 때와 업데이트 될 때 확장한 Profile 모델도 함께 생성하고 저장되게 한다.

프로파일 모델에 관한 모든 처리는 User모델을 통해서 이루어 진다.
from django.contrib.auth.models import User

def update_user_profile(request,userId):
    user = User.objects.get(pk=userId) 
    user.profile.name="홍길동" 
    user.save()
업데이트 함수에서 프로파일을 따로 처리를 해 주어야 한다.

Profile 모델을 django admin 페이지에서 보기
from django.contrib import adminfrom django.contrib.auth.admin import UserAdminfrom django.contrib.auth.models import User
from .models import Profile

class ProfileInline(admin.StackedInline):    model = Profile    can_delete = False    verbose_name_plural = 'Profile'    fk_name = 'user'

class CustomUserAdmin(UserAdmin):    inlines = (ProfileInline, )

    def get_inline_instances(self, request, obj=None):        if not obj:            return list()        return super(CustomUserAdmin, self).get_inline_instances(request, obj)

admin.site.unregister(User)admin.site.register(User, CustomUserAdmin)

댓글