ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Django Custom UserModel
    Django 2024. 8. 19. 06:17

     

    만약 기본 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 해야함.

     

    모든 걸 초기화 시킴

     

    근데 사실 이 전에 엄청 에러가 떴다.

    대충.. accounts.User와 auth.User 모델 간에 동일한 필드(groups, user_permissions)  이름 때문에 발생하는 충돌 문제라고 한다..

     

    accounts/models.py 코드를 이렇게 수정해주니까 해결되었다.

    from django.contrib.auth.models import AbstractUser, Group, Permission
    from django.db import models
    
    class User(AbstractUser):
        groups = models.ManyToManyField(
            Group,
            related_name='custom_user_groups',  # 새로운 related_name 'custom_user_groups' 추가
            blank=True,
            help_text='The groups this user belongs to.',
            verbose_name='groups',
        )
        user_permissions = models.ManyToManyField(
            Permission,
            related_name='custom_user_permissions',  # 새로운 related_name 'custom_user_permissions' 추가
            blank=True,
            help_text='Specific permissions for this user.',
            verbose_name='user permissions',
        )

     

    runserver하면

     

     

    모든게 다 사라져서 다시 만들어야함

     

     

    admin 다시 만들고, 

    python manage.py createsuperuser

     

    서버 실행해서, 회원가입 한 후

    로그인하면 

    ?? 에러가 나야 된다고 했는데.. ?? 가입이 잘 됨..🤔

     

    뭐지..

     

     

     

     

    회원가입 로직 수정

     

    accounts/forms.py

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

     

     

    accounts/views.py

    signup 함수의 UserCreationForm 부분을 → CustomUserCreationForm 으로 바꿔준다. (2군데)

    from .forms import CustomUserChangeForm, CustomUserCreationForm
    
    ...
    @require_http_methods(["GET", "POST"])
    def signup(request):
        if request.method == "POST":
            form = CustomUserCreationForm(request.POST)
            if form.is_valid():
                user= form.save()
                auth_login(request, user)
                return redirect("index")
        else:
            form = CustomUserCreationForm()
        context = {"form": form}
        return render(request, "accounts/signup.html", context)

     


     

    1: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")
    ...

     

    그 다음 마이그래이션 

    옵션 나오면 1 > 1

     

    서버 실행하면 

     

    작성자를 선택할 수 있게 되어있다. 작성자를 제외해줘야한다. 

     

    articles/forms.py

    from django import forms
    from articles.models import Article, Comment
    
    
    class ArticleForm(forms.ModelForm):
        class Meta:
            model = Article
            fields = "__all__"
            exclude = ("author",)
    
    
    class CommentForm(forms.ModelForm):
        class Meta:
            model = Comment
            fields = "__all__"
            exclude = ("article",)

     

     

    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)

     

     


     

    🔖스스로 해 볼 과제

     

    <게시글>

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

    <댓글>

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

     

     

    📌 강의 조금밖에 안남았으므로, 완강하고 바로 다시 와서 하기로👌

     

     

     

     

     

     

    'Django' 카테고리의 다른 글

    HTTP와 URL구조  (1) 2024.08.29
    Django Model Relationship (M:N)  (0) 2024.08.27
    Djnago Model Relationship (1:N)  (0) 2024.08.19
    Django 관리자 페이지 (Admin Site)  (0) 2024.08.19
    Django Static & Media  (0) 2024.08.19
Designed by Tistory.