본문 바로가기

프로젝트/장고와함께하는야생생활 임당귀

[Djagno_project] user기능

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에 저장된 정보를 삭제함으로써 로그아웃