user/models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
# custom model
class UserModel(models.Model):
class Meta:
db_table = "user"
user_id = models.CharField(max_length=20, null=False)
name = models.CharField(max_length=20, null=False)
password = models.CharField(max_length=256, null=False)
gender = models.CharField(max_length=10, null=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
# Django의 기본 user model을 상속받은 custom model
class UserModel(AbstractUser):
class Meta:
db_table = "user"
name = models.CharField(max_length=20, null=False)
gender = models.CharField(max_length=10, null=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
settings.py
# 기본 유저 모델로 user.UserModel을 사용하겠다는 선언
AUTH_USER_MODEL = 'user.UserModel'
상속 받고 난 후 회원가입 시도시 username이 비어있어서 return 에러 발생
팀원들과 S.A 당시 정한 PK 변수명 user_id에서 양해를 구하고 username으로 바꾸고 user_id를 지웠다.
- 기본 UserModel의 칼럼명이 변경 가능한지 알아봐야겠다.
user/views.py
from django.shortcuts import render, redirect
from .models import UserModel
from django.http import HttpResponse
from django.contrib.auth import get_user_model
from django.contrib import auth
from django.contrib.auth.decorators import login_required
def signup(request):
if request.method == 'GET':
return render(request, 'user/signup.html')
elif request.method == 'POST':
username = request.POST.get('username', None)
password = request.POST.get('password', None)
password2 = request.POST.get('password2', None)
name = request.POST.get('name', None)
email = request.POST.get('email', None)
gender = request.POST.get('gender', None)
if password != password2:
return render(request, 'user/signup.html')
else:
exist_user = get_user_model().objects.filter(username=username)
if exist_user:
return HttpResponse('이미 존재하는 유저입니다.')
else:
UserModel.objects.create_user(username=username,
password=password,
name=name,
email=email,
gender=gender)
return redirect('/user/login')
get_user_model().objects.filter(username=username)
위에서 입력받은 username과 일치하는 username이 있는지 확인하는 코드
중복ID 방지를 위한 로직
def login(request):
if request.method == 'POST':
username = request.POST.get('username', None)
password = request.POST.get('password', None)
me = auth.authenticate(request, username=username, password=password)
if me is not None:
auth.login(request, me)
return render(request, 'main.html')
else:
return redirect('/user/login')
elif request.method == 'GET':
return render(request, 'user/login.html')
me = auth.authenticate(request, username=username, password=password)
if me is not None:
auth.login(request, me)
Django의 기본 인증 함수 데이터베이스에서 username, password가 None이 아니라면 로그인할 수 있도록 만듦 login 함수는 me에서 받은 username, password를 session에 저장함
@login_required
def logout(request):
auth.logout(request)
return redirect('/user/login')
@login_required를 통해서 로그인한 사용자만 접근할 수 있도록 만듦
logout()함수를 통해서 session에 저장된 정보를 삭제함으로써 로그아웃
'프로젝트 > 장고와함께하는야생생활 임당귀' 카테고리의 다른 글
[Django_project] KPT-회고 (0) | 2023.04.17 |
---|---|
[Django_project] user_search (0) | 2023.04.16 |
[Django_project] user, next_url (0) | 2023.04.12 |
A2조 장고와 함께하는 야생 생활 - Django_Project S.A (0) | 2023.04.10 |