내일배움캠프 - DRF 2일차 과제

Dongwoo Kim·2022년 6월 16일
0

내일배움캠프 - DRF

목록 보기
2/12

스파르타코딩클럽

내일배움캠프 AI 웹개발자양성과정 2회차

DRF 강의 2일차 과제

과제내용

  1. Django 프로젝트를 생성하고, user 라는 앱을 만들어서 settings.py 에 등록해보세요.
  2. user/models.py에 Custom user model을 생성한 후 django에서 user table을 생성 한 모델로 사용할 수 있도록 설정해주세요
  3. user/models.py에 사용자의 상세 정보를 저장할 수 있는 UserProfile 이라는 모델을 생성해주세요
  4. blog라는 앱을 만든 후 settings.py에 등록해주세요
  5. blog/models.py에 <카테고리 이름, 설명>이 들어갈 수 있는 Category라는 모델을 만들어보세요.
  6. blog/models.py에 <글 작성자, 글 제목, 카테고리, 글 내용>이 들어갈 수 있는 Article 이라는 모델을 만들어보세요.(카테고리는 2개 이상 선택할 수 있어야 해요)
  7. Article 모델에서 외래 키를 활용해서 작성자와 카테고리의 관계를 맺어주세요
  8. admin.py에 만들었던 모델들을 추가해 사용자와 게시글을 자유롭게 생성, 수정 할 수 있도록 설정해주세요
  9. CBV 기반으로 로그인 / 로구아웃 기능을 구현해주세요
  10. CBV 기반으로 로그인 한 사용자의 게시글의 제목을 리턴해주는 기능을 구현해주세요

1. Django 프로젝트를 생성하고, user 라는 앱을 만들어서 settings.py 에 등록해보세요.

1) django 설치 및 프로젝트 생성

python -m venv venv
./venv/Script/activate
pip install django
pip install djangorestframwork
django-admin startproject nbcamp_drf_2

2) user 앱 생성

django-admin startapp user

3) settings.py에 등록

INSTALLED_APPS = [
	...,
    'user', 
]

2. user/models.py에 Custom user model을 생성한 후 django에서 user table을 생성 한 모델로 사용할 수 있도록 설정해주세요

1) user/models.py에 User 모델 정의

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

2) django에 생성한 모델 등록

python manage.py makemigrations
python manage.py migrate

3. user/models.py에 사용자의 상세 정보를 저장할 수 있는 UserProfile 이라는 모델을 생성해주세요

1) user/models.py에 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"

2) django에 생성한 모델 등록

python manage.py makemigrations
python manage.py migrate

4. blog라는 앱을 만든 후 settings.py에 등록해주세요

1) blog 앱 생성

django-admin startapp blog

2) settings.py에 등록

INSTALLED_APPS = [
	...,
    'user', 
    'blog',
]

5. blog/models.py에 <카테고리 이름, 설명>이 들어갈 수 있는 Category라는 모델을 만들어보세요.

1) blog/models.py에 Category 모델 정의

class Category(models.Model):
    category_name = models.CharField(max_length=20, unique=True)
    explain = models.TextField()

    def __str__(self):
        return self.category_name

6. blog/models.py에 <글 작성자, 글 제목, 카테고리, 글 내용>이 들어갈 수 있는 Article 이라는 모델을 만들어보세요.(카테고리는 2개 이상 선택할 수 있어야 해요)

1) blog/models.py에 Article 모델 정의

: 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}'

2) django에 생성한 모델 등록

python manage.py makemigrations
python manage.py migrate

7. Article 모델에서 외래 키를 활용해서 작성자와 카테고리의 관계를 맺어주세요

: 6번에서 one-to-many로 정의함

8. admin.py에 만들었던 모델들을 추가해 사용자와 게시글을 자유롭게 생성, 수정 할 수 있도록 설정해주세요

1) user/admin.py

admin.site.register(User)
admin.site.register(UserPorfile)

2) blog/admin.py

admin.site.register(Category)
admin.site.register(Article)

9. CBV 기반으로 로그인 / 로구아웃 기능을 구현해주세요

1) urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('user/', include('user.urls')),
]

2) user/urls.py

from . import views

urlpatterns = [
    path('login/', views.UserApiView.as_view()),
]

3) user/views.py

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

10. CBV 기반으로 로그인 한 사용자의 게시글의 제목을 리턴해주는 기능을 구현해주세요

1) urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('user/', include('user.urls')),
    path('blog/', include('blog.urls')),
]

2) blog/urls.py

from . import views

urlpatterns = [
    path('article/', views.UserArticle.as_view()),
]

3) blog/views.py

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

코드

https://github.com/kimphysicsman/nbcamp-drf-2

profile
kimphysicsman

0개의 댓글