๐ฆ ๋ด์ผ๋ฐฐ์์บ ํ/TIL(Today I Learned)
TIL_220616_DRF ๊ฐ์
- -
DRF ๊ฐ์ ๋ณธ๊ฒฉ์ ์ผ๋ก ๋ฃ๊ฒ ๋ 3์ผ์ฐจ ๊ณผ์ ์ ๋ด์ฉ..
์ด์ฐ.. ์ ์ ์ ๋ชป์ฐจ๋ฆฐ๋ค.
์๊ฐ๋ณด๋ค ์ฌ์คํ๊ณ ๋ฅํ ์ฅ๊ณ ์ ์ธ๊ณ
๊ทธ๋ฆฌ๊ณ ๋๋ฌด ํธ๋ฆฌํ ๊ธฐ๋ฅ์๋ค ์ด๋ป๊ฒ๋ ํ์ฉํ๊ธฐ ์ํ ๋ฐ๋ฒ๋ฅ..
๋ด๊ฐ ์ด ๋ชจ๋ ๊ธฐ๋ฅ๋ค์ ์ ๋ค๋ฃฐ ์ ์์๊น..
๋ ์์ ํ์ดํ ..
์๋ฌ ๋ ธํธ
์ฌ์ค ์๋ฌ๋ผ๊ธฐ ๋ณด๋ค๋ ๋ด๊ฐ ์ค์ํ ๋ด์ฉ์ด์ง๋ง, ๋ ๋ฒ ์ค์ํ์ง ์๊ธฐ ์ํด ์ ์ด๋๋ค.
<ํฌ์คํธ๋งจ ์๋ฌ>
์์ธ : TypeError: Cannot read properties of undefined (reading 'value')
๋ด์ฉ : ํฌ์คํธ๋งจ <send> ์ ๋ฐ์ํ๋ ์๋ฌ
ํด๊ฒฐ : path('login/', views."UserAPIView".as_view()),
๋ด์ฉ : urls.py ์ ๊ฒฝ๋ก์ ์๋ ํด๋์ค ๋ช ์คํ๋ก ์ธํ ์๋ฌ
3์ผ์ฐจ ๊ณผ์
1. Django ํ๋ก์ ํธ๋ฅผ ์์ฑํ๊ณ , user ๋ผ๋ ์ฑ์ ๋ง๋ค์ด์ settings.py ์ ๋ฑ๋กํด๋ณด์ธ์.
INSTALLED_APPS = [
'user',
]
2. user/models.py์ `Custom user model`์ ์์ฑํ ํ django์์ user table์ ์์ฑ ํ ๋ชจ๋ธ๋ก ์ฌ์ฉํ ์ ์๋๋ก ์ค์ ํด์ฃผ์ธ์
# custom user model
class User(AbstractBaseUser):
# unique=True ์ค์ ์ผ๋ก ์ค๋ณต๊ฐ์ ๋ฐฉ์ง
username = models.CharField("์ฌ์ฉ์ ๊ณ์ ", max_length=50, unique=True)
# ํจ์ค์๋๋ ์ํธํ๋์ด ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ max_length๋ฅผ ๋๋ํ๊ฒ ์ค์
password = models.CharField("์ฌ์ฉ์ ๋น๋ฐ๋ฒํธ", max_length=200)
email = models.EmailField("์ฌ์ฉ์ ์ด๋ฉ์ผ", max_length=254)
fullname = models.CharField("์ฌ์ฉ์ ์ด๋ฆ", max_length=20)
join_date = models.DateField("๊ฐ์
์ผ", auto_now_add=True)
# ์ฌ์ฉ์ ๊ณ์ ์ ํ์ฑํ ์ฌ๋ถ ํ์ธ
is_active = models.BooleanField(default=True)
# is_staff ์์ ํด๋น ๊ฐ ์ฌ์ฉ
is_admin = models.BooleanField(default=False)
# username ์ ์์ด๋๋ก ์ฌ์ฉํ๊ฒ ๋ค.
USERNAME_FIELD = 'username'
''' user๋ฅผ ์์ฑํ ๋ ์
๋ ฅ๋ฐ์ ํ๋ ์ง์
์ฌ์ฉํ ์ผ์ด ๊ฑฐ์ ์์ '''
REQUIRED_FIELDS = []
# custom user ์์ฑ ์ ํ์
objects = UserManager()
def __str__(self):
return self.username
# ์~ ์ด๋ฐ๊ฒ ์๊ตฌ๋ ์๊ฐํ๊ธฐ
# ๋ก๊ทธ์ธ ์ฌ์ฉ์์ ํน์ ํ
์ด๋ธ์ crud ๊ถํ์ ์ค์ , perm table์ crud ๊ถํ์ด ๋ค์ด๊ฐ๋ค.
# admin์ผ ๊ฒฝ์ฐ ํญ์ True, ๋นํ์ฑ ์ฌ์ฉ์(is_active=False)์ ๊ฒฝ์ฐ ํญ์ False
def has_perm(self, perm, obj=None):
return True
# ๋ก๊ทธ์ธ ์ฌ์ฉ์์ ํน์ app์ ์ ๊ทผ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ์ค์ , app_label์๋ app ์ด๋ฆ์ด ๋ค์ด๊ฐ๋ค.
# admin์ผ ๊ฒฝ์ฐ ํญ์ True, ๋นํ์ฑ ์ฌ์ฉ์(is_active=False)์ ๊ฒฝ์ฐ ํญ์ False
def has_module_perms(self, app_label):
return True
# admin ๊ถํ ์ค์
@property
def is_staff(self):
return self.is_admin
3. user/models.py์ ์ฌ์ฉ์์ ์์ธ ์ ๋ณด๋ฅผ ์ ์ฅํ ์ ์๋ `UserProfile` ์ด๋ผ๋ ๋ชจ๋ธ์ ์์ฑํด์ฃผ์ธ์
class UserProfile(models.Model):
user = models.OneToOneField(User, verbose_name="์ฌ์ฉ์", on_delete=models.CASCADE)
introduction = models.TextField("์๊ธฐ์๊ฐ", null=True, blank=True)
birthday = models.DateField("์์ผ")
age = models.IntegerField("๋์ด")
hobby = models.ManyToManyField(Hobby, verbose_name="์ทจ๋ฏธ")
def __str__(self):
return f"{self.user.username} ๋์ ํ๋กํ์
๋๋ค."
# user - user detail : 1:1
# ํ ์ ์ ๊ฐ ๋ ํ๋กํ์ ๊ฐ์ง ์๋ ์์ !!!! (OneToOneField)
# ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ค์ crud๋ฅผ ํ๋ค
4. blog๋ผ๋ ์ฑ์ ๋ง๋ ํ settings.py์ ๋ฑ๋กํด์ฃผ์ธ์
INSTALLED_APPS = [
'blog',
]
5. blog/models.py์ <์นดํ
๊ณ ๋ฆฌ ์ด๋ฆ, ์ค๋ช
>์ด ๋ค์ด๊ฐ ์ ์๋ `Category`๋ผ๋ ๋ชจ๋ธ์ ๋ง๋ค์ด๋ณด์ธ์.
class Category(models.Model):
name = models.CharField("์ฌ์ฉ์ ์ด๋ฆ", max_length=50)
description = models.TextField("์ค๋ช
")
def __str__(self):
return self.name
6. blog/models.py์ <๊ธ ์์ฑ์, ๊ธ ์ ๋ชฉ, ์นดํ
๊ณ ๋ฆฌ, ๊ธ ๋ด์ฉ>์ด ๋ค์ด๊ฐ ์ ์๋ `Article` ์ด๋ผ๋ ๋ชจ๋ธ์ ๋ง๋ค์ด๋ณด์ธ์.(์นดํ
๊ณ ๋ฆฌ๋ 2๊ฐ ์ด์ ์ ํํ ์ ์์ด์ผ ํด์)
# ManyToManyField
class Article(models.Model):
user = models.ForeignKey('user.User', verbose_name="๊ธ ์์ฑ์", on_delete=models.CASCADE)
title = models.CharField("๊ธ ์ ๋ชฉ", max_length=50)
content = models.TextField("๊ธ ๋ณธ๋ฌธ")
category = models.ManyToManyField(Category, verbose_name="์นดํ
๊ณ ๋ฆฌ")
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return f"{self.user.username} ๋์ด ์์ฑํ์ ๊ธ์
๋๋ค."
7. Article ๋ชจ๋ธ์์ ์ธ๋ ํค๋ฅผ ํ์ฉํด์ ์์ฑ์์ ์นดํ ๊ณ ๋ฆฌ์ ๊ด๊ณ๋ฅผ ๋งบ์ด์ฃผ์ธ์
# ForeignKey
# ์์ฑ์์ ๊ด๊ณ
user = models.ForeignKey('user.User', verbose_name="๊ธ ์์ฑ์", on_delete=models.CASCADE)
# ์นดํ
๊ณ ๋ฆฌ์ ๊ด๊ณ
category = models.ManyToManyField(Category, verbose_name="์นดํ
๊ณ ๋ฆฌ")
8. admin.py์ ๋ง๋ค์๋ ๋ชจ๋ธ๋ค์ ์ถ๊ฐํด ์ฌ์ฉ์์ ๊ฒ์๊ธ์ ์์ ๋กญ๊ฒ ์์ฑ, ์์ ํ ์ ์๋๋ก ์ค์ ํด์ฃผ์ธ์
from django.contrib import admin
from blog.models import Category, Article
# Register your models here.
admin.site.register(Category)
admin.site.register(Article)
9. CBV ๊ธฐ๋ฐ์ผ๋ก ๋ก๊ทธ์ธ / ๋ก๊ตฌ์์ ๊ธฐ๋ฅ์ ๊ตฌํํด์ฃผ์ธ์
from django.contrib.auth import login, logout, authenticate
class UserAPIView(APIView):
# permission_classes = [permissions.AllowAny]
# ๋ก๊ทธ์ธ
def post(self, request):
username = request.data.get('username', '')
password = request.data.get('password', '')
user = authenticate(request, username=username, password=password)
if not user:
return Response({"error": "์กด์ฌํ์ง ์๋ ๊ณ์ ์ด๊ฑฐ๋ ํจ์ค์๋๊ฐ ์ผ์นํ์ง ์์ต๋๋ค."})
login(request, user)
return Response({"message": "login success!"})
def delete(self, request):
logout(request)
return Response({"message": "logout success!"})
10. CBV ๊ธฐ๋ฐ์ผ๋ก ๋ก๊ทธ์ธ ํ ์ฌ์ฉ์์ ๊ฒ์๊ธ์ ์ ๋ชฉ์ ๋ฆฌํดํด์ฃผ๋ ๊ธฐ๋ฅ์ ๊ตฌํํด์ฃผ์ธ์
def __str__(self):
return f"{self.user.username} ๋์ด ์์ฑํ์ ๊ธ์
๋๋ค."
'๐ฆ ๋ด์ผ๋ฐฐ์์บ ํ > TIL(Today I Learned)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
TIL_220620_DRF ๊ฐ์ (0) | 2023.01.01 |
---|---|
TIL_220617_DRF ๊ฐ์ (0) | 2023.01.01 |
TIL_220615_DRF ๊ฐ์ (0) | 2023.01.01 |
TIL_220614_ํ ํ๋ก์ ํธ django (0) | 2023.01.01 |
TIL_220613_ํ ํ๋ก์ ํธ django (0) | 2023.01.01 |
Contents
๋น์ ์ด ์ข์ํ ๋งํ ์ฝํ ์ธ
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค