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 |
댓글