장고에서 User model를 만들 때에는, 네가지 방법이 있다
기본 매니저(objects)를 변경하거나 메서드를 추가 하는 정도의 변화 등 파이썬 수준의 동작만을 변경 하고 싶을 경우에 사용한다.
예) 관리자와 일반 유저의 행동만 다른 경우에 효율적으로 기능만 분리할 때
User모델을 상속하고, Meta Class에서 Proxy=True를 입력해서 proxy 모델 클래스인 것을 선언할 수 있다.
Django의 인증 시스템을 그대로 활용하고 로그인, 권한 부여 등과 상관이 없는 사용자 정보 필드를 저장하고자 할 때 사용한다.
models.Model을 상속하여 작성한 모델에, 기존 User 모델과 OneToOneField로 일대일관계를 맺어서 사용자에 관한 정보를 저장한다.
User Model(로그인 인증 처리 부분 등)을 그대로 가져다 쓰는 대신 필드만 재정의 할 때 사용한다.
settings.py에 AUTH_USER_MODEL = ‘{App_name}.{model_name}’ 를 추가해주어야 한다.
필드를 재정의할 뿐만 아니라, User의 인증 및 권환 관리(로그인 인증 처리 절차) 등을 수정할 때 사용한다.
settings.py에 AUTH_USER_MODEL = ‘{App_name}.{model_name}’ 를 추가해주어야 한다.
Manager(기존의 objects)를 만들어서 설정해주어야한다.
#project/accounts/models.py from django.db import models from django.contrib.auth.models import AbstractUser class Profile(AbstractUser): age = models.PositiveIntegerField(help_text="User Age", blank=True, null=True)
#project/accounts/admin.py from django.contrib import admin from django.contrib.auth.admin import UserAdmin as BaseUserAdmin from .models import Profile from .views import CreateUserForm # Register your models here. class UserAdmin(BaseUserAdmin): add_form = CreateUserForm admin.site.register(Profile)
#project/accounts/urls.py from django.urls import path from accounts import views app_name = 'accounts' urlpatterns = [ # /accounts/ path('', views.home, name = 'home'), path('signup', views.signup, name = 'signup'), ] #project/project/settings.py AUTH_USER_MODEL = 'accounts.Profile' # project/blog/models.py (User를 싹 다 Profile로 변경) from accounts.models import Profile
# project/accounts/views.py from django.shortcuts import render, redirect from .models import Profile from django.contrib.auth.forms import UserCreationForm # Create your views here. def home(request): return render(request, 'accounts/home.html’) class CreateUserForm(UserCreationForm): class Meta: model=Profile fields=['username', 'email', 'age', 'password1', 'password2’] def signup(request): form = CreateUserForm if request.method == "POST": form = CreateUserForm(request.POST) if form.is_valid(): form.save() return redirect('accounts:home') return render(request, 'accounts/signup.html', {'form': form})