Leta Learns

django | User 모델을 이용한 Signup, User 확장 본문

Django

django | User 모델을 이용한 Signup, User 확장

leta 2021. 7. 16. 16:04

 

account/views.py

from django.shortcuts import render, redirect
from django.contrib.auth.forms import AuthenticationForm, UserCreationForm
from django.contrib import auth

def signup_view(request):
  if request.method == 'POST':
    form = UserCreationForm(request.POST)
    if form.is_valid():
      user = form.save()
      auth.login(request, user)
      return redirect('home')
    return redirect('account:signup')
    
  else:
    form = UserCreationForm()
    return render(request, 'signup.html', {'form' : form})

장고에서 UserCreationForm이라는 ModelForm을 이미 만들어놓았기 때문에 가능.

그냥 import해서 사용하면 됨.

 

 

base.html에서 NavBar 수정하기

(로그인 된 상태에서는 회원가입 버튼 x, 로그아웃 상태에서만 회원가입 버튼 뜨도록)

 

 

 


 

 

 

User 모델 확장

장고의 기본 user 모델은 실제 서비스에서는 매우 한정적임.

 

(User 모델 기본 구성)

class User(models.Model):
	username = models.CharField(max_length=150)
	password = models.CharField(max_length=128)
	last_login = models.DateTimeField(blank=True, null=True)
   	first_name = models.CharField(max_length=30, blank=True)
   	last_name = models.CharField(max_length=150, blank=True)
   	email = models.EmailField(blank=True)
   	is_staff = models.BooleanField()
   	is_active = models.BooleanField()
   	date_joined = models.DateTimeField()
	is_superuser = models.BooleanField()

더 필요한 정보를 데이터에 저장하려면 User모델에 추가해야함.

 

 

account/models.py (-> 해당내용 정의)

from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.

class CustomUser(AbstractUser):
 	nickname = models.CharField(max_length=100)
   	university = models.CharField(max_length=50)
   	location = models.CharField(max_length=200)

장고 User모델 확장을 위해 AbstractUser 클래스를 상속해야함.

 

 

 

settings.py

AUTH_USER_MODEL = 'account.CustomUser'

account앱 models.py에 만든 CustomUser 모델을 통해 auth기능을 사용하기 위해서 settings.py에 추가해준 것.

auth : 장고에서 제공하는 로그인, 회원가입 등을 위한 것.....

 

 

models.py 수정했으니 makemigrations, migrate 하기

기존에 superuser생성하면서 만들었던 user모델이 존재해서 migrate시 오류가 발생함.

  이를 피하기 위해 잠시 admin과 관련된 것들을 주석처리 한 다음 migrate해주고

  migrate한 후 해당 주석처리 다시 풀어주기.

 

 

 


 

 

 

forms.py 작성

User 모델에 새로운 데이터 필드 추가했으므로 새로운 forms.py 작성해줘야 함.

 

account/forms.py

from django.contrib.auth.forms import UserCreationForm
from .models import CustomUser

class SignupForm(UserCreationForm):
  class Meta:
    model = CustomUser
    fields = ['username', 'password1', 'password2', 'nickname', 'university', 'location']

UserCreationForm을 상속해서 SignupForm 만들기.

fields에 nickname, university, location 필드 추가.

 

변경된 내용은 account/views.py에도 적용해야 함

 

account/views.py

from .forms import SignupForm

def signup_view(request):
  if request.method == 'POST':
    form = SignupForm(request.POST)
    if form.is_valid():
      user = form.save()
      auth.login(request, user)
      return redirect('home')
    return redirect('account:signup')

  else:
    form = SignupForm()
    return render(request, 'signup.html', {'form' : form})

SignupForm import하기.

(기존에 쓴 UserCreationForm을 SignupForm으로 대체)

 

 

 

로그인된 사용자에게 인사해주는 코드

{% if user.is_authenticated %}

 => 로그인 되어있는지 묻는 코드

 

blog/home.html

{% if user.is_authenticated %}
      {{user.location}}에 사는 {{user.university}}다니는 {{user.nickname}} 안녕하세요!
{% endif %}

 

=> 회원, 비회원마다 각각 다른 화면이 보여짐.

 

 

 


 

 

 

Admin 페이지에 모델 등록

admin 페이지 : 데이터 관리 => 가입된 회원 정보도 관리 가능.

 

account/admin.py

from django.contrib import admin
from .models import CustomUser
# Register your models here.

admin.site.register(CustomUser)

 

 

'Django' 카테고리의 다른 글

django | Pagination  (0) 2021.07.18
쿼리 스트링 Query String  (0) 2021.07.18
django | User 모델을 이용한 login, logout  (0) 2021.07.13
django | Forms  (0) 2021.07.08
django | Media 파일  (0) 2021.07.08
Comments