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)
댓글
댓글 쓰기