실습 설명
1. 유저 모델에 필드 3개를 추가해 주세요.
- 닉네임(nickname): 웹사이트 내에서 사용되는 이름 (최대 15자, 중복 불가능)
- 카카오 ID(kakao_id): 판매자 연락처 (최대 20자, 중복 가능: 지금은 카카오 ID를 검증할 방법이 없으니까 그냥 중복을 허용합니다).
- 주소(address): 물품을 조회할 때 참고할 수 있는 (판매자) 주소 (최대 40자, 중복 가능: 지금은 주소를 검증할 방법이 없기 때문에 주어진 형식은 없습니다.)
2. migration을 만들고 적용해 주세요.
3. 추가한 필드들도 어드민 페이지에 나타나도록 어드민 페이지에 추가해 주시고, (admin 계정으로) 어드민 페이지에 들어가서 기존 유저들의 닉네임, 카카오 ID, 주소를 설정해 주세요.
- admin@example.com: admin(닉네임), pdmadmin(카카오 ID), 서울 중구 청계천로(주소)
- user1@example.com: 유저1(닉네임), kakaouser1(카카오 ID), 서울 용산구 이태원동(주소)
4. 닉네임, 카카오 ID, 주소 필드들을 회원가입 페이지에 추가해 주세요. (나중에 디자인을 적용할 것이기 때문에 필드의 순서가 이상하게 나와도 상관없습니다.) 회원가입 페이지를 완성하면 새로운 유저를 추가해 주세요.
- user2@example.com(이메일), django123(비밀번호) 유저2(닉네임), kakaouser2(카카오 ID), 서울 진관동(주소)
5. 홈페이지에 (로그인이 돼있는 경우) 유저의 닉네임, 카카오 ID, 주소 정보를 추가해 주세요.
풀이
1. 유저 모델에 필드 3개를 추가해 주세요.
podomarket/models.py
class User(AbstractUser):
nickname = models.CharField(
max_length=15,
unique=True,
null=True,
)
kakao_id = models.CharField(max_length=20, null=True)
address = models.CharField(max_length=40, null=True)
닉네임, 카카오 ID, 주소 모두 문자열이기 때문에 CharField를 사용하면 된다. 그리고 allauth는 기본 정보(이메일, 비밀번호)가 채워진 오브젝트를 저장하고, 추가 정보를 저장하기 때문에 추가 필드에는 null=True 옵션을 줘야 한다.
닉네임 같은 경우 중복을 허용하지 않기 때문에 unique=True 옵션을 추가해 줬다. (unique의 디폴트 값은 False)
2. migration을 만들고 적용해 주세요.
Terminal
python manage.py makemigrations
python manage.py migrate
모든 추가 필드에 null=True 옵션을 써 줬기 때문에 기존 유저들의 필드에는 null이 들어간다.
3. 추가한 필드들도 어드민 페이지에 나타나도록 어드민 페이지에 추가해 주시고, (admin 계정으로) 어드민 페이지에 들어가서 기존 유저들의 닉네임, 카카오 ID, 주소를 설정해 주세요.
유저 모델에 추가하는 필드는 기본적으로 어드민 페이지에 나타나지 않는데, 어드민 페이지에 추가해 주려면 아래와 같은 코드를 추가해 주면 된다.
Admin.py
UserAdmin.fieldsets += ('Custom fields', {'fields': ('nickname', 'kakao_id', 'address',)}),
어드민 페이지로 들어가서 admin@example.com, user1@example.com 유저들의 추가 필드 값을 설정해준다.
4. 닉네임, 카카오 ID, 주소 필드들을 회원가입 페이지에 추가해 주세요. (나중에 디자인을 적용할 것이기 때문에 필드의 순서가 이상하게 나와도 상관없습니다.) 회원가입 페이지를 완성하면 새로운 유저를 추가해 주세요.
allauth의 회원가입 페이지에 필드들을 추가하려면 일단 필드들에 대한 django 폼을 만들어야 한다. podomarket 앱 아래에 forms.py 파일을 만들고 폼을 정의해 주면 된다.
podomarket/forms.py
from django import forms
from .models import User
class SignupForm(forms.ModelForm):
class Meta:
model = User
fields = ['nickname', 'kakao_id', 'address']
ModelForm을 쓰면 보다 쉽게 폼을 만들 수 있다. 모델은 유저 모델로 설정해 주고, 입력을 받을 추가 필드들을 리스트해 준다.
그다음에는 signup(self, request, user) 메소드를 구현해 줘야 하는데, signup() 메소드는 폼으로 입력받는 데이터를 유저 인스턴스에 저장해준다.
class SignupForm(forms.ModelForm):
...
def signup(self, request, user):
user.nickname = self.cleaned_data['nickname']
user.kakao_id = self.cleaned_data['kakao_id']
user.address = self.cleaned_data['address']
user.save()
폼 데이터를 user 필드에 할당한 다음, user를 저장해 주면 된다.
그리고 마지막으로 정의한 SignupForm 클래스를 회원가입 때 사용하겠다고 말해 줘야 한다.
podomarket_project/settings.py
# Auth settings
...
ACCOUNT_SIGNUP_FORM_CLASS = 'podomarket.forms.SignupForm'
새로운 회원가입 페이지에서 새로운 유저를 한 명 만들어 준다.
5. 홈페이지에 (로그인이 돼있는 경우) 유저의 닉네임, 카카오 ID, 주소 정보를 추가해 주세요.
index.html 파일에 닉네임, 카카오 ID, 주소 정보를 추가해 준다.
podomarket/index.html
...
{% if user.is_authenticated %}
<p>안녕하세요 {{ user }}님!</p>
<p>회원님의 정보입니다:</p>
<ul>
<li>닉네임 - {{ user.nickname }}</li>
<li>카카오 ID - {{ user.kakao_id }}</li>
<li>주소 - {{ user.address }}</li>
</ul>
{% else %}
<p>로그아웃된 상태입니다.</p>
{% endif %}
실행결과
'BackEnd > Django 유저 기능 구현하기' 카테고리의 다른 글
[유저 기능과 django-allauth 패키지] 포도마켓: 이메일 로그인, 로그인 기억하기 (0) | 2023.04.11 |
---|---|
[유저 기능과 django-allauth 패키지] 포도마켓: 홈페이지 만들기 (2) | 2023.04.06 |
[유저 기능과 django-allauth 패키지] 포도마켓: 프로젝트 시작하기 (0) | 2023.04.06 |
[유저 기능과 django-allauth 패키지] django-allauth, 유저 모델 퀴즈 (0) | 2023.04.06 |
[유저 기능과 django-allauth 패키지] 패키지 vs 앱 (0) | 2023.04.06 |