2021.12.17 - [Study/Django] - [Django] 장고 유저 기능 구현하기 #7 (로그인 기억하기)
이전 게시글에 이어 이번에는 유저에게 닉네임을 설정할 수 있게 만들어보겠습니다.
모델에 닉네임 필드 추가하기
첫 번째로 아래 코드와 같이 모델에 닉네임 필드를 추가해줍니다.
# models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
nickname = models.CharField(max_length=15, unique=True)
def __str__(self):
return self.email
닉네임은 중복 닉네임을 방지하기 위해 unique 옵션을 True로 주고 만들었습니다.
하지만 이대로 makemigrations를 통해 모델을 적용시키려 하면 오류가 발생하는 것을 알 수 있습니다.
It is impossible to add a non-nullable field 'nickname' to user without specifying a default. This is because the database needs something to populate existing rows. Please select a fix: 1) Provide a one-off default now (will be set on all existing rows with a null value for this column) 2) Quit and manually define a default value in models.py. Select an option:
위는 간단하게 말하면 닉네임 필드를 설정하기 전에 이미 만들어놓은 유저들이 닉네임을 설정해주지 않아서 기본값을 설정해주거나 모델 설정을 다시 해달라는 말입니다.
그래서 위의 사진과 같이 2가지의 방법 중 하나를 선택해서 하면 됩니다.
하지만 allauth에서 유저를 생성할 때는, 기본적인 유저를 생성하고, 그다음 추가된 내용을 입력받기 때문에 이때 null=True 옵션이 없다면 또 오류가 발생할 것이기 때문에 저는 null=True 옵션을 추가하는 방식으로 하겠습니다.
class User(AbstractUser):
nickname = models.CharField(max_length=15, unique=True, null=True)
def __str__(self):
return self.email
그럼 이제 위 코드처럼 null=True로 설정해준 후 데이터베이스를 적용시키면 무사히 적용이 완료되는 것을 볼 수 있습니다.
Admin 페이지 설정을 위한 admin.py 셋팅
위처럼 코드를 작성하고 난 후, admin 페이지에 들어가 보면 nickname을 설정하는 필드가 없어서 당황했는데요.
이때 allauth에서는 아래와 같이 설정을 해주어야 한다고 합니다.
만약 admin에 UserAdmin을 사용한다면 사용자 정의 User에 추가한 필드는 관리자 페이지에 나오지 않는다. 나오게 하기 위해서 fieldsets을 정의해 주어야 한다.
# admin.py
from django.contrib import admin
from .models import User
from django.contrib.auth.admin import UserAdmin
# Register your models here.
admin.site.register(User, UserAdmin)
UserAdmin.fieldsets += (("Custom fields", {"fields": ("nickname",)}),)
Customfields라는 이름으로 nickname 필드를 추가해주었습니다!
자 그러면 이제 admin 페이지에서 nickname 필드가 보이게 됩니다.
회원가입 Form 수정하기
이제 회원가입을 할 때, Nickname도 입력을 받아야 하는데요.
그를 위해 회원가입 폼을 수정해주도록 하겠습니다.
# forms.py
from django import forms
from .models import User
class SignupForm(forms.ModelForm):
class Meta: # 메타 클래스에 사용할 모델과 필드를 설정
model = User
fields = ["nickname"]
def signup(self, request, user):
user.nickname = self.cleaned_data["nickname"] # form에 기입된 데이터를 가져오기 위해 cleaned_data 사용
user.save()
위처럼 회원가입을 위한 form을 생성해준 후 settings.py 에서 이 form을 사용하겠다는 설정을 추가해줘야 합니다.
#settings.py
...
ACCOUNT_SIGNUP_FORM_CLASS = 'coplate.forms.SignupForm'
...
위 코드를 settings.py에 설정해주면 coplate의 forms 파일의 SighupForm을 사용하겠다는 뜻입니다.
그럼 위 사진처럼 회원가입 시 Nickname 필드가 생겨나게 됩니다!
'Study > Django' 카테고리의 다른 글
[Django] 장고 유저 기능 구현하기 #10 (이메일 인증 기능) (0) | 2021.12.20 |
---|---|
[Django] 장고 유저 기능 구현하기 #9 ( 회원가입 정보 유효성 검사) (0) | 2021.12.19 |
[Django] 장고 유저 기능 구현하기 #7 (로그인 기억하기) (0) | 2021.12.17 |
[Django] 장고 유저 기능 구현하기 #6 (이메일로 로그인 하기 기능 구현) (1) | 2021.12.17 |
[Django] 장고 유저 기능 구현하기 #5 ( 페이지에서 로그인 로그아웃 구현) (1) | 2021.12.15 |