기본적으로 Django 에서 User clss 를 지원하지만,
계정마다 선수카드를 갖고 있어야 하기 때문에 이에 맞춰 Customize 해줘야한다.
유저 등을 관리할 account 앱을 만든다.
django-admin startapp account
models.py 에 User 를 상속받아 customizing 한다.
# account/models.py
from djongo import models
from django.contrib.auth.models import (BaseUserManager, AbstractBaseUser)
from player.models import Player
class UserManager(BaseUserManager):
def create_user(self, username, password=None):
user = self.model(
username=username,
)
user.set_password(password)
user.save(using=self._db)
return user
#createsuperuser
def create_superuser(self, username, password):
user = self.create_user(
username,
password=password,
)
user.is_admin = True
user.save(using=self._db)
return user
class User(AbstractBaseUser):
username = models.CharField(
max_length=20,
null=False,
unique=True,
default=''
)
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
#선수를 담을 Team 을 갖도록 한다.
team = models.ManyToManyField(Player,related_name='team_user')
objects = UserManager()
USERNAME_FIELD = 'username'
def __str__(self):
return self.username
def has_perm(self, perm, obj=None):
return True
def has_module_perms(self, app_label):
return True
@property
def is_staff(self):
return self.is_admin
User 계정을 생성하거나 변경할때 사용할 form 을 cutomize 한 User에 맞게 정의해준다.
#account/forms.py
from django import forms
from django.contrib.auth.forms import ReadOnlyPasswordHashField, AuthenticationForm
from .models import User
class UserCreationForm(forms.ModelForm):
password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
password2 = forms.CharField(
label='Password confirmation', widget=forms.PasswordInput)
class Meta:
model = User
fields = ('username',)
def clean_password2(self):
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
raise forms.ValidationError("Passwords don't match")
return password2
def save(self, commit=True):
user = super().save(commit=False)
user.set_password(self.cleaned_data["password1"])
if commit:
user.save()
return user
class UserChangeForm(forms.ModelForm):
password = ReadOnlyPasswordHashField()
class Meta:
model = User
fields = ('username','password','is_active', 'is_admin')
def clean_password(self):
return self.initial["password"]
계정 생성 로직에 따른 views 를 정의한다.
#account/views.py
from django.http import HttpResponse
from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect
from .forms import UserCreationForm
def signup(request):
if request.method == "POST":
form = UserCreationForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
raw_password = form.cleaned_data.get('password1')
user = authenticate(username=username, password=raw_password) # 사용자 인증
login(request, user) # 로그인
return redirect('index')
else:
form = UserCreationForm()
return render(request, 'common/signup.html', {'form': form})
호출에 사용할 url 을 정의한다.
#account/urls.py
from django.urls import path
from . import views
from django.contrib.auth import views as auth_views
app_name= 'account'
urlpatterns = [
path('login/', auth_views.LoginView.as_view(template_name='common/login.html'), name='login'),
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
path('signup/',views.signup, name='signup')
]
settings 파일에 커스텀한 User를 사용하겠다고 알린다.
#futQualizer/settings.py
AUTH_USER_MODEL = 'account.User'
추가로 admin 에서 사용할 내용도 정의한다.
#account/admin.py
from django.contrib import admin
from django.contrib.auth.models import Group
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from .forms import UserChangeForm, UserCreationForm
from .models import User
class UserAdmin(BaseUserAdmin):
form = UserChangeForm
add_form = UserCreationForm
list_display = ('username', 'is_admin')
list_filter = ('is_admin',)
fieldsets = (
(None, {'fields': ('username', 'password')}),
('Permissions', {'fields': ('is_admin',)}),
)
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('username', 'password1', 'password2')}
),
)
search_fields = ('username',)
ordering = ('username',)
filter_horizontal = ()
admin.site.register(User, UserAdmin)
admin.site.unregister(Group)
super-user 를 생성하고 진행하면 된다.