-
Django Custom UserModelDjango 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