Custom user model
을 생성한 후 django에서 user table을 생성 한 모델로 사용할 수 있도록 설정해주세요UserProfile
이라는 모델을 생성해주세요Category
라는 모델을 만들어보세요.Article
이라는 모델을 만들어보세요.(카테고리는 2개 이상 선택할 수 있어야 해요)python -m venv venv
./venv/Script/activate
pip install django
pip install djangorestframwork
django-admin startproject nbcamp_drf_2
django-admin startapp user
INSTALLED_APPS = [
...,
'user',
]
Custom user model
을 생성한 후 django에서 user table을 생성 한 모델로 사용할 수 있도록 설정해주세요from django.db import models
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser
class UserManager(BaseUserManager):
def create_user(self, username, password=None):
if not username:
raise ValueError('Users must have an username')
user = self.model(
username=username,
)
user.set_password(password)
user.save(using=self._db)
return user
# python manage.py createsuperuser 사용 시 해당 함수가 사용됨
def create_superuser(self, username, password=None):
user = self.create_user(
username=username,
password=password
)
user.is_admin = True
user.save(using=self._db)
return user
class User(AbstractBaseUser):
username = models.CharField("사용자 아이디", max_length=12, unique=True)
email = models.EmailField("이메일", max_length=100)
password = models.CharField("비밀번호", max_length=128)
fullname = models.CharField('이름', max_length=20)
join_date = models.DateTimeField('생성시각', auto_now_add=True)
def __str__(self):
return self.username
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = []
objects = UserManager()
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
python manage.py makemigrations
python manage.py migrate
UserProfile
이라는 모델을 생성해주세요: User 모델과 one-to-one 관계
class UserPorfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
intro = models.TextField()
age = models.IntegerField()
interest = models.CharField(max_length=10)
def __str__(self):
return f"{self.user.name}'s profile"
python manage.py makemigrations
python manage.py migrate
django-admin startapp blog
INSTALLED_APPS = [
...,
'user',
'blog',
]
Category
라는 모델을 만들어보세요.class Category(models.Model):
category_name = models.CharField(max_length=20, unique=True)
explain = models.TextField()
def __str__(self):
return self.category_name
Article
이라는 모델을 만들어보세요.(카테고리는 2개 이상 선택할 수 있어야 해요): Category와 many-to-many 관계, User와 one-to-many 관계
class Article(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=50)
content = models.TextField()
category = models.ManyToManyField(Category)
def __str__(self):
return f'{self.title} - {self.author}'
python manage.py makemigrations
python manage.py migrate
: 6번에서 one-to-many로 정의함
admin.site.register(User)
admin.site.register(UserPorfile)
admin.site.register(Category)
admin.site.register(Article)
urlpatterns = [
path('admin/', admin.site.urls),
path('user/', include('user.urls')),
]
from . import views
urlpatterns = [
path('login/', views.UserApiView.as_view()),
]
from django.contrib.auth import login, authenticate, logout
# 로그인 로그아웃 기능
class UserApiView(APIView):
# 로그인
def post(self, request):
user = authenticate(request, **request.data)
if not user:
msg = '아이디 또는 패스워드를 확인해주세요.'
return Response({'message': msg})
login(request, user)
msg = '로그인 성공!'
return Response({'message': msg}, status=status.HTTP_200_OK)
def delete(self, request):
logout(request)
msg = '로그아웃 성공!'
return Response({'message': msg})
urlpatterns = [
path('admin/', admin.site.urls),
path('user/', include('user.urls')),
path('blog/', include('blog.urls')),
]
from . import views
urlpatterns = [
path('article/', views.UserArticle.as_view()),
]
from .models import Article
# 사용자 게시글 기능
class UserArticle(APIView):
# 사용자의 게시글의 제목 리스트 보여주기
def get(self, request):
user = request.user.is_authenticated
if not user:
msg = '로그인을 해주세요.'
return Response({'message': msg})
articles = Article.objects.filter(author=user)
titles = [ article.title for article in articles ]
return Response({'titles': titles})