๋ก๊ทธ์ธ์ด๋ ํ์๊ฐ์ ์ ์ํ ์ ์ ๋ชจ๋ธ์ ๋ง๋ค์ด์ค์ผ ํ๋ค.
์ฅ๊ณ ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ์ ์ ๋ชจ๋ธ(auth _user)
์ด ์๋ค
๊ธฐ๋ณธ์ผ๋ก ์ ๊ณต๋๋ auth_user
๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ํ์ ๊ธฐ๋ณธ ํจ์์ธ passwordcheck
๋ ์ํธํ
๋ฅผ ์ฌ์ฉํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
ํ์ง๋ง, ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ ์ ์ ๋ชจ๋ธ์ ์ํ๋ field
๊ฐ ์์ ๊ฒฝ์ฐ, ์ ์ ๋ชจ๋ธ์ ๋ฐ๋ก ๋ง๋ค์ด ์ค ์ ์๋ค.
์๋ก์ด ์ ์ ๋ชจ๋ธ์ ๋ง๋ค์ด ์ค ๋๋ ๊ธฐ์กด์ auth_user
๋ฅผ ๊ฐ์ ธ๊ฐ๋ฉด์ ์ปค์คํ
ํ์ฌ ๋ง๋ค์ด์ฃผ๋ ๋ฐฉ๋ฒ๊ณผ, auth_user
๋ ๋ฌด์ํ ์ฑ ์๋กญ๊ฒ ๋ง๋ค์ด์ฃผ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
์์ ์๋กญ๊ฒ ๋ง๋ค์ด ์ค ๊ฒฝ์ฐ์๋ ๊ธฐ์กด ์ ์ ๋ชจ๋ธ์์ ์ฌ์ฉํ ์ ์๋ ํ์ ๊ธฐ๋ณธ ํจ์๋ ์๋กญ๊ฒ ๋ง๋ค์ด ์ค์ผ ํ๊ธฐ ๋๋ฌธ์
๊ธฐ์กด ์ ์ ๋ชจ๋ธ์ ์ด๋ฆฌ๋ฉด์ ์ปค์คํ
ํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค
์ด๋ ์ฅ๊ณ ์์ defalt๋ก ์ฌ์ฉํ๋ ์ ์ ๋ชจ๋ธ์ 1๊ฐ์ฌ์ผ ํ๋ค.
์ง๊ธ์ ์ด๋ฏธ ๊ธฐ๋ณธ ์ ์ ๋ชจ๋ธ์ด DB์ ๋ง์ด๊ทธ๋ ์ด์
๋ ์ํ์ด๋ฏ๋ก, ๊ธฐ๋ณธ ์ ์ ๋ชจ๋ธ์ ๋ํ DB๋ฅผ ์ง์์ฃผ๊ณ ์ปค์คํ
์ ์ ๋ชจ๋ธ์ ๋ง๋ค์ด์ค์ผ ํ๋ค.
๋ฐ๋ผ์ ์ฅ๊ณ ๋ฅผ ์ด์ฉํด ์๋น์ค๋ฅผ ๋ง๋ค๋ ๋จผ์ ์ฌ์ฉ์ ๋ชจ๋ธ์ ์ด๋ป๊ฒ ํ ๊ฒ์ธ์ง ๊ฒฐ์ ํ๊ณ ๋ง๋๋ ๊ฒ์ด ์ข๋ค
์๋ ์๋ ์ฅ๊ณ ์ ๊ธฐ๋ณธ ์ ์ ๋ชจ๋ธ์ ์ง์์ค ๋ค ์ปค์คํ ์ ์ ๋ชจ๋ธ์ ๋ง๋ค์ด์ค๋ค
user/models.py
from django.contrib.auth.base_user import AbstractBaseUser
class User(AbstractBaseUser):
"""
์ ์ ํ๋กํ ์ฌ์ง
์ ์ ๋๋ค์ -> ํ๋ฉด์ ํ๊ธฐ๋๋ ์ด๋ฆ
์ ์ ์ด๋ฆ -> ์ค์ ์ฌ์ฉ์ ์ด๋ฆ
์ ์ ์ด๋ฉ์ผ ์ฃผ์ -> ํ์๊ฐ์
ํ ๋ ์ฌ์ฉ๋๋ ์์ด๋
์ ์ ๋น๋ฐ๋ฒํธ -> ๊ธฐ๋ณธ๊ฐ ์ฐ์
"""
profile = models.TextField()
nickname = models.CharField(max_length=24, unique=Ture)
name = models.CharField(max_length=24)
email = models.EmailField(unique=Ture)
USERNAME_FIELD = 'nickname'
class Meta:
db_table = "User"
class Meta: db_table = "User"
๋ง๋ค์ด์ค ์ปค์คํ
์ ์ ๋ชจ๋ธ์ settings
ํ์ผ์ ๋ฑ๋ก์์ผ์ค๋ค
instagram/settins.py
...
AUTH_USER_MODEL = 'user.User' # ์ปค์คํ
์ ์ ๋ชจ๋ธ ๋ฑ๋ก
DB๋ฅผ ๋ง๋ค์ด์ฃผ๊ธฐ ์ํด ๋ง์ด๊ทธ๋ ์ด์ ์ ํด์ค๋ค.
(venv)
python manage.py makemigrations
(venv)
python manage.py migrate
๊ทธ๋ผ User
๋ผ๋ ์ด๋ฆ์ ํ
์ด๋ธ์ด ์๊ธด ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
urls
๋ถ๋ฆฌํ๊ธฐurls
๋ ์ฑ๋ง๋ค ๋๋ ์ค ์ ์๋ค.
ํ์ฌ๋ instagram/urls.py ํ์ผ์์ ๋ชจ๋ url
์ ์์ง๋ง, ์ฑ๋ง๋ค ๋ถ๋ฆฌ๋ฅผ ์์ผ๋ณด๋๋ก ํ๊ฒ ๋ค.
content
ํด๋์ urls.py
ํ์ผ์ ์ถ๊ฐํด ์ฃผ๊ณ ๋ค์ ์ฝ๋๋ฅผ ์์ฑํด ์ค ๋ค์
๊ธฐ์กด itagram/urls.py
ํ์ผ๋ ์์ ํด์ฃผ๋๋ก ํ๊ฒ ๋ค.
content/urls.py
from django.urls import path
from .views import UploadFeed
urlpatterns = [
path('upload', UploadFeed.as_view())
]
instagram/urls.py
...
urlpatterns = [
...
# path('content/upload', UploadFeed.as_view())
path('content/', include('content.urls'))
]
...
include
๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋น ์ฑ์ urls.py
๋ฅผ ์ฐธ์กฐํ๋ค.
user/view.py
from django.shortcuts import render
from rest_framework.views import APIView
class Join(APIView):
def get(self, request):
return render(request, "user/join.html")
class Login(APIView):
def get(self, request):
return render(request, "user/login.html")
urls
์ ์ฐ๊ฒฐํด์ค๋ค.
user/urls.py
from django.urls import path
from .views import Join, Login
urlpatterns = [
path('join', Join.as_view()),
path('login', Login.as_view())
]
์ฑ urls
๋ฅผ ๋ฃจํธํด๋์ urls.py
์ ์ฐ๊ฒฐํด์ค๋ค.
instagram/urls.py
...
urlpatterns = [
...
path('user/', include('user.urls')),
]
...
ํ์๊ฐ์ , ๋ก๊ทธ์ธ html์ ๋ง๋ค์ด ์ค๋ค.
templates/join.html
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<title>ํ์๊ฐ์
</title>
</head>
<body style="background: rgb(245,245,245)">
<div style="text-align: center; width: 400px; height: 500px; border: solid 1px gray; margin: 100px auto 20px auto; background: white;">
<div style="width: 360px; height: 500px; margin: 50px auto 50px auto;">
<div><img style="width: 160px; margin-bottom:20px;" src="https://www.instagram.com/static/images/web/mobile_nav_type_logo.png/735145cfe0a4.png"></div>
<div style="color: gray; font-weight: bolder; margin-bottom: 60px;"> ์น๊ตฌ๋ค์ ์ฌ์ง๊ณผ ๋์์์ ๋ณด๋ ค๋ฉด ๊ฐ์
ํ์ธ์ </div>
<div class="form-floating mb-3">
<input style="width: 300px; height: 24px; margin: auto;" type="email" class="form-control" id="floatingInput" placeholder="name@example.com">
<label style="font-size: 13px; padding: 4px 10px; margin-left: 30px; margin-top: 2px;" for="floatingInput">ํด๋ํฐ ๋ฒํธ ๋๋ ์ด๋ฉ์ผ ์ฃผ์</label>
</div>
<div class="form-floating mb-3">
<input style="width: 300px; height: 24px; margin: auto;" type="text" class="form-control" id="floatingInput" placeholder="name@example.com">
<label style="font-size: 13px; padding: 4px 10px; margin-left: 30px; margin-top: 2px;" for="floatingInput">์ด๋ฆ</label>
</div>
<div class="form-floating mb-3">
<input style="width: 300px; height: 24px; margin: auto;" type="text" class="form-control" id="floatingInput" placeholder="name@example.com">
<label style="font-size: 13px; padding: 4px 10px; margin-left: 30px; margin-top: 2px;" for="floatingInput">๋๋ค์</label>
</div>
<div class="form-floating mb-3">
<input style="width: 300px; height: 24px; margin: auto;" type="text" class="form-control" id="floatingInput" placeholder="name@example.com">
<label style="font-size: 13px; padding: 4px 10px; margin-left: 30px; margin-top: 2px;" for="floatingInput">๋น๋ฐ ๋ฒํธ</label>
</div>
<button style="width: 300px; height: 32px; margin: auto; font-size: 14px; font-weight: bolder; margin-top: 8px;" type="button" class="btn btn-primary">๊ฐ์
</button>
</div>
</div>
<div style="text-align: center; width: 400px; height: 80px; border: solid 1px gray; margin: 20px auto 100px auto; background: white;">
<div style="margin: 28px auto 28px auto;"> ๊ณ์ ์ด ์์ผ์ ๊ฐ์? <a href="login">๋ก๊ทธ์ธ</a></div>
</div>
<!-- Optional JavaScript; choose one of the two! -->
<!-- Option 1: Bootstrap Bundle with Popper -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
<!-- Option 2: Separate Popper and Bootstrap JS -->
<!--
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js" integrity="sha384-7+zCNj/IqJ95wo16oMtfsKbZ9ccEh31eOz1HGyDuCQ6wgnyJNSYdrPa03rtR1zdB" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>
-->
</body>
</html>
templates/login.html
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<title>๋ก๊ทธ์ธ</title>
</head>
<body style="background: rgb(245,245,245)">
<div style="text-align: center; width: 400px; height: 500px; border: solid 1px gray; margin: 100px auto 20px auto; background: white;">
<div style="width: 360px; height: 500px; margin: 50px auto 50px auto;">
<div><img style="width: 160px; margin-bottom:20px;" src="https://www.instagram.com/static/images/web/mobile_nav_type_logo.png/735145cfe0a4.png"></div>
<div style="color: gray; font-weight: bolder; margin-bottom: 60px;"> ์น๊ตฌ๋ค์ ์ฌ์ง๊ณผ ๋์์์ ๋ณด๋ ค๋ฉด ๊ฐ์
ํ์ธ์ </div>
<div class="form-floating mb-3">
<input style="width: 300px; height: 24px; margin: auto;" type="email" class="form-control" id="floatingInput" placeholder="name@example.com">
<label style="font-size: 13px; padding: 4px 10px; margin-left: 30px; margin-top: 2px;" for="floatingInput">ํด๋ํฐ ๋ฒํธ ๋๋ ์ด๋ฉ์ผ ์ฃผ์</label>
</div>
<div class="form-floating mb-3">
<input style="width: 300px; height: 24px; margin: auto;" type="text" class="form-control" id="floatingInput" placeholder="name@example.com">
<label style="font-size: 13px; padding: 4px 10px; margin-left: 30px; margin-top: 2px;" for="floatingInput">๋น๋ฐ ๋ฒํธ</label>
</div>
<button style="width: 300px; height: 32px; margin: auto; font-size: 14px; font-weight: bolder; margin-top: 8px;" type="button" class="btn btn-primary">๋ก๊ทธ์ธ</button>
</div>
</div>
<div style="text-align: center; width: 400px; height: 80px; border: solid 1px gray; margin: 20px auto 100px auto; background: white;">
<div style="margin: 28px auto 28px auto;">๊ณ์ ์ด ์์ผ์ ๊ฐ์? <a href="join">๊ฐ์
ํ๊ธฐ</a></div>
</div>
<!-- Optional JavaScript; choose one of the two! -->
<!-- Option 1: Bootstrap Bundle with Popper -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
<!-- Option 2: Separate Popper and Bootstrap JS -->
<!--
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.10.2/dist/umd/popper.min.js" integrity="sha384-7+zCNj/IqJ95wo16oMtfsKbZ9ccEh31eOz1HGyDuCQ6wgnyJNSYdrPa03rtR1zdB" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>
-->
</body>
</html>
๐ ์ฐธ๊ณ
๊ฐ์