로그인, Cumtom User

KHoney·2022년 7월 18일
0

futqualizer

목록 보기
4/8

Custom User

기본적으로 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 를 생성하고 진행하면 된다.

profile
좋은 개발자가 되고싶은

0개의 댓글