본문 바로가기
개발/Django_python 웹 프레임워크

로그인, 회원가입 3 -User Model 확장 / OneToOneField 사용

by 자유로운 코끼리 2020. 7. 21.
728x90

Django 에는 기본적으로 정의되어 있는 User 모델이 있습니다.

이때 기본적으로 정의되어 있는 모델보다 더 다양한 정보를 넣고 싶을 수 있겠죠?

 

User 모델의 확장 여러 가지 방법

  • 프록시 모델 사용하기
  • User 모델과 일대일관계의 테이블 추가하기
  • AbstractUser 모델 상속한 사용자 정의 User 모델 사용하기
  • AbstractBaseUser 모델 상속한 사용자 정의 User 모델 사용하기

 

User 모델과 일대일관계의 테이블 추가

 

기존 User 모델과 OneToOneField로 일대일관계를 맺는 Django 모델을 추가해서

사용자에 관한 정보를 추가로 더 저장하는 방법입니다.

 

이는 쟝고의 인증 시스템을 그대로 활용하고 로그인, 권한 부여 등과 상관이 없는

사용자 정보 필드를 추가하고자 할 때 사용되어집니다.

 

1. Profile model 작성

# ~/models.py 
#user 속성을 제외하고는 임의로 정해주셔도 됩니다.

class Profile(models.Model):
	user = models.OneToOneField(User, on_delete=models.CASCADE)
	# user model 과 1:1 의 관계임을 나타냄
	nickname = models.CharField(max_length=50) 
	region = models.CharField(max_length=50)
    
    
 #####2
 #@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()

OneToOneField를 통해 기존 User 모델 1:1을 해주었습니다.

 

###@receiver을 이용하여 user 내용 바꾸면  profile도 바뀌게 할 수 있습니다-

더보기

2. @receiver 시그널 작성(은 그냥 읽어주세요!! 적용 ㄴㄴ)

보통 1:1 관계를 가질 때 보통 user을 생성하면 profile도 디폴트로 함께 생성되곤 합니다.

하지만 쟝고에서는 디폴트로 생성되지 않기 때문에 @receiver을 통해 user가 생성될 때마다 참조하는 방법이 있습니다.

 

user model이 생성 혹은 수정되었을 때

Profile model 도 자동으로 생성 혹은 수정해줍니다.

 

post_save라는 signal을 사용하여,

senser=User을 통해 User의 save()가 호출될 때 마다 그 직후에 함수 두 가지가 모두 호출되어

User가 생성될 때 Profile모델도 생성되게끔 하였습니다.

 

그런데 이렇게 하면 나중에 에러가 날 수 있다고 합니다.

이유는,,, 좀 더 찾아보겠습니당.

 

 

2. admin.py Profile model

#~/admins.py
from django.contrib import admin
from .models import Profile 


admin.site.register(Profile)

3. migrate

4. signup.html 추가

 

<input name="nickname" type="text" value="">
<input name="region" type="text" value="">

5. signup 함수 수정

def signup(request):
    if request.method == 'POST':
        if request.POST['password1'] == request.POST['password2']:
            user = User.objects.create_user(request.POST['username'], password=request.POST['password1']) 
			
            profile = Profile()
            profile.user=user
            profile.nickname = request.POST["nickname"]
            profile.region = request.POST['region']
            profile.save()
            
            return redirect('/')
    return render(request, 'signup.html')
    
    #템플릿에서 온 nickname 과 region 데이터를 저장
    #user.profile.nickname= request.POST['nickname']
    #user.profile.region = request.POST['region'] 
            

6. 사용 - 일반적인 템플릿변수를 사용하는 것과 동일합니당.!

{{user.profile.region}}
{{user.profile.nickname}}

 

'개발 > Django_python 웹 프레임워크' 카테고리의 다른 글

ModelForm - Forms.py  (0) 2020.07.25
Pagination  (0) 2020.07.23
로그인, 회원가입 2 -Blog Model - User Model 연동, 1:N  (1) 2020.07.20
Django 회원가입, 로그인  (1) 2020.07.20
Django 구동원리 : MTV  (0) 2020.07.19

댓글