Lina's Toolbox

Custom UserModel 활용하기 본문

스파르타 내일 배움 캠프 AI 웹개발 과정/Django framework

Custom UserModel 활용하기

Woolina 2024. 9. 16. 04:27

Custom User Model

현재 UserModel은!

  • Django의 기본 User Model을 사용하고 있습니다.
  • 대부분의 프로젝트에서는 User Model에 더 많은 기능들이 필요합니다.
  • Django는 AUTH_USER_MODEL setting을 변경하여 기본 User Model을 대체할 수 있습니다.
  • 만약 기본 User Model을 사용하더라도 Custom User Model을 사용하는 것이 권장됩니다.

 

적용하기

⚠️ 주의
- AUTH_USER_MODEL 설정은 반드시 프로젝트 최초 마이그레이션에서 함께 진행하기를 권장합니다.
- USER Model은 비지니스로직 깊숙이 관여되기에 중간에 변경하면 많은 변경사항을 야기합니다. 

User Model 정의하기

  • accounts/models.py
from django.db import models
from django.contrib.auth.models import AbstractUser


# Create your models here.
class User(AbstractUser):
    pass

⇒ 기본 유저를 변경하지 않더라도 확장성을 위해 Custom User Model을 작성해요!

 

settings.py

...
AUTH_USER_MODEL = 'accounts.User'
...

 

accounts/admin.py

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User

admin.site.register(User, UserAdmin)

 

  • migration 적용하기
    • 프로젝트 중간에 진행되므로 데이터베이스를 초기화하고 진행합니다.
    • → 그렇지 않을 경우, 마이그레이션이 뒤엉키게 돼요!
    • db.sqlite3 파일 삭제 및 모든 migration 삭제 후 다시 migration합니다.
💡 DB만 삭제하는게 아니라, 마이그레이션을 다시 다 해야하는 이유!
마이그레이션은 체이닝 되어있기 때문
0002는 0001에 dependecy를 가지고있다
(심지어 다른 앱의 마이그레이션과도)

회원가입 로직 수정

 

  • 기존의 UserCreationForm은 Django의 기본 User 모델을 사용중이므로 해당 부분 수정이 필요합니다.
  • → accounts.User를 바라보도록 상속을 통한 클래스를 재정의해요!
  • forms.py
class CustomUserCreationForm(UserCreationForm):
    class Meta:
        model = get_user_model()
        fields = UserCreationForm.Meta.fields + (필요시 추가필드)

 

 

💡 CustomUserChageForm은 바꾸지 않아도 되는 이유가 뭘까??

→ 거기서는 auth.User가 아니라 get_user_model()로 이미 쓰고 있었기때문


1:N 관계 확장하기

User(1) - Article(N) 확장하기

articles/models.py

...
from django.conf import settings


class Article(models.Model):
...
		author = models.ForeignKey(
				settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="articles")
...

import하고 settings.AUTH_USER_MODEL == get_user_model() == accounts.User 같은 것임.

그냥 다양한 방법일 뿐!

migration

기존의 존재하던 데이터에 대해 어떻게 처리해야할까?

author참조키 만들고 python manage.py makemigration하면 1,2 선택이 나온다.

1 선택 → default가 될 값 입력하여 그 값으로 채워주게 한다

우리는 1 로 입력! (1번 유저가 존재하므로!!)

 

 

articles/forms.py

→ 작성자를 제외해주는 것이 필요

 

 

articles/views.py

def create(request):
			if request.method == "POST":
					form =ArticleForm(request.POST, request.FILES)
			    if form.is_valid():
			        article = form.save(commit=False)
			        article.author = request.user
			        article.save()
			        return redirect("articles:article_detail", article.pk)
      else:
	        form =ArticleForm()
	        
	    context = {"form":form}
	    return reder(request, "articles/create.html", context)

 


과제 🔖

📢 게시글과 댓글을 아래 조건에 맞게 구현해볼까요?

 

<게시글>

  • 게시글 작성자가 누구인지 글목록에서 보여주세요.
  • 내가 작성한 게시글만 삭제할 수 있도록 만들어 주세요. (삭제가 가능한 경우만 삭제 버튼 노출)
  • 내가 작성한 게시글만 수정할 수 있도록 만들어 주세요. (수정이 가능한 경우만 수정 버튼 노출)

<댓글>

  • 댓글 작성에도 작성자를 적용해 주세요.
  • 댓글 목록에서 작성자를 노출해 주세요.
  • 로그인을 하지 않은 유저는 댓글을 입력하지 못하도록 해주세요.
  • 내가 작성한 댓글만 삭제할 수 있도록 만들어 주세요. (삭제가 가능한 경우만 삭제 버튼 노출)