1. 배경
장고에서 User역할을 하는 app을 따로 생성한 뒤, SignUp을 CreateView를 상속받아 사용할 수 있습니다. 이때, form_class로 UserCreationForm을 이용하면 아래와 같은 [Manager isn't available; 'auth.User' has been swapped for 'accounts.User'] 에러가 발생합니다. 원인과 이를 해결하는 방법을 알아보겠습니다.
2. 해결
1) 원인
저는 User를 accounts라는 app으로 새로 만들었습니다. settings.py에 AUTH_USER_MODEL = "accounts.User" 도 잘 추가해 줬습니다. 그런데 SignUpVIew에서 form_class로 사용하는 UserCreationForm은 기본적으로 django의 default user를 참조합니다. 그렇기 때문에, 우리가 생성한 User로 Form을 새로 만들어야 해결됩니다.
2) forms.py
Custom User 앱(저는 accounts)에서 forms.py를 생성합니다. 그리고 User를 get_user_model()이라는 함수로 가져와도 되고, 아니면 우리가 생성한 User 모델을 가져와도 됩니다. 즉, 아래 코드 2가지 중 한 가지 방법을 쓰면 됩니다. 주로 get_user_model() 함수를 씁니다.
User = get_user_model() # 첫 번째 방법
from accounts.models import User # 두 번째 방법
그리고 해당 User 객체를 UserCreationForm을 상속받은 SignupForm에 Meta 클래스를 정의해 주고, UserCreationForm.Meta를 상속받은뒤 model에 할당해주시면 됩니다. 코드로는 아래와 같습니다.
3) views.py
이후, 방금 정의한 SignupForm을 View에서 form_class에 넣어주시면, 회원 가입이 정상적으로 작동하게 됩니다.
Reference
1. django Logo: https://codecondo.com/jobs-for-django-developers/django-framework-logo/
2. content: https://stackoverflow.com/questions/17873855/manager-isnt-available-user-has-been-swapped-for-pet-person
'Back-End > Django' 카테고리의 다른 글
[Django] 간단하게 알아보는 N+1 문제 해결! (select_related, prefetch_related) (0) | 2022.08.11 |
---|---|
[Django] SQL 쿼리 로그 확인하기 (feat. 콘솔창) (0) | 2022.08.11 |
[Django] login_required 3가지 구현 방법 (AOP, Decorator) (0) | 2022.08.10 |
[Django] 로그인, 로그아웃 간단 구현! (CBV) (0) | 2022.08.10 |
[Django] django command로 메일 보내기2 (HTML Template 활용) (0) | 2022.08.09 |