Django

Custom UserModel(플젝 시작시 유의)

zhelddustmq 2024. 8. 20. 21:56

01. Custom User Model

02. 1:N 관계 확장하기

 

 

 

01. 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은 비지니스로직 깊숙이 관여되기에 중간에 변경하면 많은 변경사항을 야기
#  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

회원가입 로직 수정

  • 기존의 UserCreationForm은 Django의 기본 User 모델을 사용중이므로 해당 부분 수정이 필요
  • → accounts.User를 바라보도록 상속을 통한 클래스를 재정의
#  forms.py

class CustomUserCreationForm(UserCreationForm):
    class Meta:
        model = get_user_model()
        fields = UserCreationForm.Meta.fields + (필요시 추가필드)

 

02. 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")
...

migration

 

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

# 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)

 

 

게시글 작성자가 누구인지 글목록에서 보이기

articles/articles.html

 

내가 작성한 게시글만 삭제 및 수정할 수 있도록 만들기 (삭제 및 수정이 가능한 경우만 버튼 노출)

articles/articles_detail.html

 

댓글 작성에도 작성자를 적용 및 노출 (삭제 버튼 노출 어쩌구저쩌구)

articles/models.py

 

articles/forms.py

마이그레이션 한 후,

articles/views.py

articles/article_detail.html

 

로그인 안한사람 코멘트 못달게 하기

승주님에게 압도적 감사 -_-

 

'Django' 카테고리의 다른 글

Django Bootstrap, Fontawesome  (0) 2024.08.22
Model Relationship(M:N)  (0) 2024.08.21
Model Relationship (1:N)  (0) 2024.08.19
Admin  (0) 2024.08.19
Django Static, Media(runserver)  (1) 2024.08.19