수학과의 좌충우돌 프로그래밍

[Django] OneToOne 방법으로 User Model 확장 본문

웹프로그래밍/Django

[Django] OneToOne 방법으로 User Model 확장

ssung.k 2019. 5. 4. 21:05

OneToOne 사용하여 User Model 추가하기

저번에 장고에서 제공해주는 User Model을 사용하여 로그인 및 로그아웃, 회원가입을 구현하였습니다.

https://ssungkang.tistory.com/entry/Django-10-%ED%9A%8C%EC%9B%90%EA%B0%80%EC%9E%85%EB%A1%9C%EA%B7%B8%EC%9D%B8%EB%A1%9C%EA%B7%B8%EC%95%84%EC%9B%83-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0

장고에서 제공해주는 기본 모델은 부족한 점이 많아보입니다. 우리가 원하는 필드들이 모두 존재하는 것이 아니었기 때문에 이를 업그레이드 시켜보도록 하겠습니다.여러 가지 방법이 있겠지만 그 중에서 가장 직관적이고 쉬운 방법을 택해보았습니다. 그 방법은 새로운 Model을 만들어서 기존의 User Model과 OneToOne 으로 연결하는 방식입니다. 그리고 내가 만든 Model에 새로운 필드를 추가해주는 방법으로 진행했습니다.

# models.py

from django.db import models
from django.contrib.auth.models import User

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    nickname = models.TextField(max_length=10)

위에서 User 를 import 하고 Profile 이라는 Model 을 만들어 주었습니다. 그 후 연결을 시켜주고 새로운 필드 nickname을 추가하였습니다.

따라서 회원가입 시, 기존에 입력하던 id, password 정보 외에도 nickname 정보를 입력받아 저장해주었습니다.

# views.py
def signup(request):
    if request.method == "POST":
        if request.POST["password1"] == request.POST["password2"]:
            user = User.objects.create_user(
                username=request.POST["username"],
                password=request.POST["password1"])
            nickname = request.POST["nickname"]
            profile = Profile(user=user, nickname=nickname)
            profile.save()
            auth.login(request,user)
            return redirect('account:home')
    return render(request, 'account/signup.html')

그리고 User Model 은 templates 에 기본적으로 존재하기 때문에 view 에서 굳이 뿌려주지 않아도 쉽게 접근이 가능합니다.

<!-- home.html -->
{{ user.profile.nickname }} 님 반갑습니다. 

. 을 통해 연결해 nickname 까지 접근할 수 있었습니다.

Comments