user
: ์ฌ์ฉ์ ๊ด๋ฆฌ (ํ์๊ฐ์
/ ๋ก๊ทธ์ธ ๋๋ ๋ก๊ทธ์์) tweet
: ๊ธ ๊ด๋ฆฌ (๊ธ ์ฐ๊ธฐ, ์์ , ์ญ์ / ๋๊ธ)django-admin startapp (์ฑ์ด๋ฆ)
$ django-admin startapp user
$ django-admin startapp tweet
์ธ์ํ ์ ์๋๋ก
์ธํ
ํด์ฃผ์ด์ผ ํ๋ค. settings.py
์ INSTALLED_APPS
์ ์ถ๊ฐ์ ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํด์ฃผ์ด์ผ ํ๋ค. #### ์๋จ ์๋ต ####
# Application definition
INSTALLED_APPS = [
# ์ฐ๋ฆฌ๊ฐ ์์ฑํ app ์ถ๊ฐ
'user',
'tweet',
# django์ ๊ธฐ๋ณธ app
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
#### ํ๋จ ์๋ต ####
settings.py
์์ ํ์ธํด๋ณด์.#### ์๋จ ์๋ต ####
# Database
# https://docs.djangoproject.com/en/4.0/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
#### ํ๋จ ์๋ต ####
sqlite3
์ ์ฌ์ฉํ ๊ฒ์ด๋ฉฐ, ์์ ์ฝ๋๋ฅผ ํ์ธํด๋ณด๋ ์ฝ๋ ์์ผ๋ก๋ ์ฐ๊ฒฐ์ด ๋ ๊ฒ์ ์ ์ ์๋ค.django๋ฅผ ํ ๋ฒ ์คํํด๋ด์ผ
ํ๋ค. ์คํ์ ํ๊ฒ ๋๋ฉด ์ฝ์์ ์๋์ ๊ฐ์ ๋ฉ์ธ์ง๊ฐ ๋์ค๊ฒ ๋๋ค.์ธํ
์ด ์ ๋๊ฒ
์ด๋ค.)System check identified no issues (0 silenced).
May 28, 2022 - 15:48:13
Django version 4.0.4, using settings 'djangoProject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
ํ๋ก์ ํธ ํ์๊ธฐ์ db.sqlite3
๊ฐ ์์ฑ๋์๋ค๋ฉด ์ฐ๊ฒฐ์ด ์ ๋๊ฒ์ด๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋์ผ๋ก ํ์ธํด๋ณด์.
์ค๋ฅธ์ชฝ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํด๋ฆญ ํ, [+ ๋ฒํผ] - ๊ฒฝ๋ก ๋ฐ์ดํฐ ์์ค
์ ํ
์ฒซ ๋ฒ์งธ๋ก ํ๋ก์ ํธ์ ์ด๋ฆ
์ ํ์ธํ๊ณ , ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฒ ์ด์ค
์ ํ
๋๋ผ์ด๋ฒ
๋ฅผ ๋ด๊ฐ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ง๊ฒ ์ ํํ๊ณ ํ์ธ
์๋จ์ ๊ฑด๋๋ฆฌ์ง ์๊ณ ํ๋จ์ ์ฐ๊ฒฐ ํ
์คํธ
๋ถ๋ถ์ ์ง์ค
์์ ๊ณผ์ ์ ๋ง๋ฌด๋ฆฌํ๋ฉด ์๋์ ์ฐฝ์ด ์์ฑ๋จ
user model
์ ์ ๊ณตํ๊ณ ์๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๋ ์ง์ user model
์ ์์ฑํด๋ณผ ๊ฒ์ด๋ฉฐ, ์ถํ django์ ๊ธฐ๋ณธ ๋ชจ๋ธ๊ณผ ์ฐ๋ฆฌ์ ๋ชจ๋ธ์ ํฉ์ณ๋ณผ ๊ฒ์ด๋ค. user model
์์ฑuser model
์์ฑ์ ํ์ํ ๊ฒ๋ค์ ์ ํด๋ณด์์ด๋ฆ, ๋น๋ฐ๋ฒํธ, ์ํ๋ฉ์ธ์ง, ์์ฑ์ผ
user/models.py
์ ๋ชจ๋ธ ์์ฑ# user/models.py
from django.db import models
# ๋ด๊ฐ ์์ฑํ user model
class UserModel(models.Model):
# ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์๋๋ model์ ์ด๋ฆ ์์ฑ
class Meta:
db_table = "my_user"
# ์ฌ์ฉ์ ์ด๋ฆ
username = models.CharField(max_length=20, null=False)
# ๋น๋ฐ๋ฒํธ
password = models.CharField(max_length=256, null=False)
# ์ํ ๋ฉ์ธ์ง
bio = models.CharField(max_length=256, default='')
# ์์ฑ์ผ
created_at = models.DateTimeField(auto_now_add=True)
# ์์ ์ผ
updated_at = models.DateTimeField(auto_now=True)
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณ๊ฒฝ์ ์๋ ค์ฃผ๋ ๋ช
๋ น์ด
๋ฅผ ์ฌ์ฉํ๋ค. (ํฐ๋ฏธ๋)$ python manage.py makemigrations
๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ฐ์ํด ์ฃผ๋ ๋ช
๋ น์ด
๋ฅผ ์ฌ์ฉํ๋ค.$ python manage.py migrate
meta
ํด๋์ค์์ ์ ์ธํ ๋ชจ๋ธ์ ์ด๋ฆ์ ์ฐพ๋๋ค.๊ด๋ฆฌ์ ํ์ด์ง
url
์ ํด๋ฆญํ๋ค. (์ง์ ์น๋๊ฑฐ ๋น์ฐํ ok)Watching for file changes with StatReloader
System check identified no issues (0 silenced).
May 28, 2022 - 16:35:41
Django version 4.0.4, using settings 'djangoProject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
์ฒซ ํ์ด์ง๊ฐ ์ด๋ ๊ฒ ๋์ค๊ฒ ๋๋ค. ์ค์ ํ ๊ฒ์ด ์์ด์ ๊ทธ๋ฐ ๊ฒ์ด๋ผ ๊ด์ฐฎ๋ค.
์ด์ ์ฐ๋ฆฌ์ url ๋ค์ /admin
์ ์ถ๊ฐํด์ค๋ค. ๊ทธ๋ฌ๋ฉด ํ๋จ์ ํ์ด์ง๊ฐ ๋์ค๊ฒ ๋๋ค.
์ด์ ์ฐ๋ฆฌ๋ ๊ด๋ฆฌ์ ์๋ฒ์ ์ ์ํ ์ ์๋ ๊ณ์ ์ ๋ง๋ค์ด์ผ ํ๋ค. django ์๋ฒ๋ฅผ ๋๊ณ ๊ณ์ ์ ๋ง๋ค์ด๋ณด์.
termianl
์ ์ด๊ณ , ์๋์ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋ค.
$ python manage.py createsuperuser
ํ๋จ์ ์ ๋ณด๋ค์ ๊ธฐ์
ํ๋ค.
superuser
์์ฑ์ ์๋ฃํ์์ผ๋, ๋ค์ admin
ํ์ด์ง์ ๊ฐ์ ๋ก๊ทธ์ธ์ ์งํํ๋ค.
user model
์ admin
ํ์ด์ง์ ๋ฑ๋กํด๋ณด๋๋ก ํ๊ฒ ๋ค.user/models.py
์ UserModel
์ ๋ฑ๋กํ๋ ๊ฒ์ด๋ฏ๋ก, user/admin.py
๋ก ๋ค์ด๊ฐ ๋ฑ๋ก์ ์งํํ๋๋ก ํ๊ฒ ๋ค.# django์์ admin ํด์ ์ฌ์ฉํ๊ฒ ๋ค.
from django.contrib import admin
# ์ฐ๋ฆฌ๊ฐ ์์ฑํ ๋ชจ๋ธ์ ๊ฐ์ ธ์จ๋ค.
# .models -> ์ฐ๋ฆฌ์ ์์น์ ๋์ผํ ์์น์ ์๋ models.py๋ฅผ ์ฌ์ฉํ๊ฒ ๋ค.
# UserModel -> models.py ์์ ์๋ UserModel์ ์ฌ์ฉํ๊ฒ ๋ค.
from .models import UserModel
# ๋์ UserModel์ Admin์ ์ถ๊ฐ
admin.site.register(UserModel)
+ Add
๋ฅผ ๋๋ฌ user๋ฅผ ๋ฑ๋กํ ์ ์๋ค. UserModel
์์ ์์ฑํ๋ ์์๋ค์ด ๋ค์ด๊ฐ ์๋ค.created_at
๊ณผ updated_at
์ django์์ ์๋์ผ๋ก ๊ฐ์ ๋ฃ์ด์ฃผ๊ธฐ
๋๋ฌธ์ ๋ณด์ด์ง ์๋๋ค.์์ฑ์, ๋ด์ฉ, ๊ธ ์์ฑ์ผ์, ์์ ์ผ์
tweet/models.py
๋ก ๋ค์ด๊ฐ ๋ชจ๋ธ์ ์์ฑํ์.User model
์ ์์ฑํ ๋์ ๋ค๋ฅด๊ฒ ForeignKey
๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค. User model
์์ ๊ฐ์ ธ์ฌ ์ ์๋ค.# tweet/models.py
from django.db import models
# user app์ ์๋ ๋ชจ๋ธ์ ๊ฐ์ ธ์ ์ฌ์ฉํ ๊ฒ์ธ๋ฐ, ๊ทธ ๋ชจ๋ธ์ ์ด๋ฆ์ UserModel์ด๋ค.
from user.models import UserModel
class TweetModel(models.Model):
class Meta:
db_table = "tweet"
# ์ธ๋ํค๋ฅผ ์ฌ์ฉํด ๋ค๋ฅธ ๋ชจ๋ธ์ ์์๋ฅผ ์ฌ์ฉํ๋ค.
author = models.ForeignKey(UserModel, on_delete=models.CASCADE)
content = models.CharField(max_length=256)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
$ python manage.py makemigrations
$ python manage.py migrate
ForeignKey
๊ฐ ์ ์ ์ฉ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.tweet/admin.py
์ tweet model
์ ๋ฑ๋กํ๋ค. from django.contrib import admin
from .models import TweetModel
admin.site.register(TweetModel)
์ฌ๋๋์ ๊ฐ์ด ํ๋ฉด์ ๋์ฐ๊ธฐ ์ํด์ html
ํ์ผ์ ์ถ๊ฐํด์ฃผ๋๋ก ํ๊ฒ ๋ค.
ํด๋น ํ๋ก์ ํธ์ ๊ธฐ๋ณธ ํ๋ฉด์ด ๋๋ base.html
ํ์ผ์ ์ถ๊ฐํ์๋ค.
๋ํ user app
๊ณผ ๊ด๋ จ๋ html
ํ์ผ์ ์ถ๊ฐํ์๋ค.
signup.html
signin.html
์ด๋ฒ html
์์๋ ์ด์ ๊ณผ ๋ค๋ฅด๊ฒ template ๋ฌธ๋ฒ
์ ์ฌ์ฉํ์๋ค.
html
์ ์ค๋ณต๋๊ฒ ๊ณ์ ์์ฑํ์ง ์์๋ ๋๋๋ก html์ ์ด์ด์ ์์ฑ
ํ ์ ์๊ฒ ํด์ฃผ๊ณ , python์ ๋ฌธ๋ฒ
์ ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ฒ ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋ template ๋ฌธ๋ฒ
์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
base.html
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
nav bar ๊ด๋ จ ๋ด์ฉ
</nav>
{% block content %}
{% endblock %}
</body>
signup.html
{% extends 'base.html' %}
{% block title %}
ํ์๊ฐ์
{% endblock %}
{% block content %}
html ๋ด์ฉ
{% endblock %}
signin.html
{% extends 'base.html' %}
{% block title %}
๋ก๊ทธ์ธ
{% endblock %}
{% block content %}
html ๋ด์ฉ
{% endblock %}
์ฐ๋ฆฌ์ ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋ ๊ณตํต๋ชจ๋
์ base.html
์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ฐ๋ฆฌ๋ ๊ณตํต๋ชจ๋์ ์ฌ์ฉํ๋ฉด์ ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ด์ฉ์ ๊ณตํต๋ชจ๋ ์๋์ ๋ถ์ฌ์ ์ฌ์ฉํ ์์ ์ด๋ค. ๊ณตํต๋ชจ๋ ์์ {% block content %}{% endblock %}
์ ์ ์ด์ฃผ๊ณ , ์ด๊ณณ์์ ์ฌ์ฉํ ํ์๋ชจ๋๋ค์ ๋ธ๋ก ์ด๋ฆ์ content๋ก ๋ง์ถฐ์ฃผ๋ฉด ๋๋ค.
๊ณตํต ๋ชจ๋ ์๋์ ๋ถ์ฌ์ ์ฌ์ฉํ ํ์ html ํ์ผ๋ค ์์ {% extends 'base.html' %}
์ ๋ถ์ฌ์ฃผ๊ณ , {% block content %} ..html ๋ด์ฉ.. {% endblock %}
๊ณผ ๊ฐ์ด ์ฌ์ฉํ๊ฒ ๋ html์ ๋ด์ฉ์ ์ ์ด์ฃผ๋ฉด ๋๋ค.
template
์ ์์ฑ์ด ๋๋๊ฒ ๋์๋ค. django์ MVT ํจํด์ ๋ฐ๋ผ view, url
์ ์์ฑํด ๊ฐ ํ
ํ๋ฆฟ๋ค์ ์ฐ๊ฒฐํด์ฃผ๊ณ ์ด๋ค ์ญํ ์ ํด์ผํ๋์ง์ ๋ํด ์ค์ ํ๋๋ก ํ๊ฒ ๋ค.user.urls.py
ํ์ผ ๋ง๋ค๊ธฐdjangoProject/urls.py
์ ์๋ ค์ค์ผ ํ๋๋ฐ, ์๋ ค์ฃผ๊ธฐ ์ ์ url์ ๋ง๋ค์ด์ผ ๊ฒ ์ง??djangoProject/urls.py
์ ์๋ ค์ฃผ๊ธฐfrom django.contrib import admin
from django.urls import path, include
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
# user/urls.py์ djangoProject/urls.py๋ฅผ ์ฐ๊ฒฐํด ์ค.
# ์ด์ django๊ฐ url์ ์์๋ค์ ์ ์์.
path('', include('user.urls')),
]
user/views.py
์์ฑ# render๋ฅผ ํตํด์ html์ ํ๋ฉด์ ๋์์ค
from django.shortcuts import render
def sign_up_view(request):
return render(request, 'user/signup.html')
def sign_in_view(request):
return render(request, 'user/signin.html')
user.urls.py
์์ฑfrom django.urls import path
from . import views
urlpatterns = [
path('sign-up/', views.sign_up_view, name='sign-up'),
path('sign-in/', views.sign_in_view, name='sign-in'),
]
http://127.0.0.1:8000/
์ sign-up/
์ ๋ถ์ฌ์ ์ ์ํ๊ฒ ๋๋ฉด user/views.py
์ ์๋ sign_up_view
ํจ์๊ฐ ์คํ๋๋ค. ํด๋น ํจ์๋ ์ฌ์ฉ์๋ฅผ templates/user/signup.html
๋ก render์์ผ์ค๋ค.๋ชจ๋ ์ผ์ด ๋ฒ์ด์ง๋ app์ด ์ด๋๋
๋ ๊ฒ์ด๋ค. ์ฐ๋ฆฌ์ ํ๋ก์ ํธ์์ ์ฌ์ฉ์ ๊ด๋ จ ์ผ์ ์ ๋ถ user
app์์ ์ผ์ด๋๋ ๊ฒ์ผ๋ก ์ค์ ์ด ๋์ด ์๋ค.POST
์์ฒญ์ ์ฌ์ฉํ๋ค. ๋ฐ๋ผ์ ์ด์ ๋ง๊ฒ ์์ฑํ๋๋ก ํ๊ฒ ๋ค.#### user/views.py ####
# render๋ฅผ ํตํด์ html์ ํ๋ฉด์ ๋์์ค
from django.shortcuts import render
# ํ์๊ฐ์
def sign_up_view(request):
# ์ฐ๋ฆฌ์ ์ฅ๊ณ ์๋ฒ์๊ฒ ๋ค์ด์ค๋ ์์ฒญ์ ๋ฐ๋ฅธ ํ๋์ ํ๋ค.
# GET ๋ฉ์๋๋ฉด ํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ณ
if request.method == 'GET':
return render(request, 'user/signup.html')
# POST ๋ฉ์๋๋ฉด ์๋์ ์์
๋ค์ ์งํํ๊ฒ ๋ค.
elif request.method == 'POST':
return ''
def sign_in_view(request):
return render(request, 'user/signin.html')
<form>
ํ๊ทธ์ด๋ค. <form>
ํ๊ทธ๋ ํ๋ฉด์ ์
๋ ฅํ ์ ๋ณด๋ฅผ ์๋ฒ๋ก ๋ณด๋ด์ค ๋ ๋ง์ด ์ฌ์ฉํ๋ ํ๊ทธ์ด๋ค. <form>
ํ๊ทธ ์์ ์๋ <button>
์ ๋๋ฅด๊ฒ ๋๋ฉด ํด๋น ํผ์ด ์๋ฒ๋ก ์ ์ก๋๋๋ฐ, ์๋์ ๊ฐ์ ์ธํ
์ ํตํด์ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ด๋ค url์ ์ ๋ฌ๋ ์ง ์ค์
ํด์ผ ํ๋ค. /sign-up/
์ ๋ท ์ฌ๋์๋ ๊ผญ ๋ถ์ฌ์ค์ผ ํ๋ค. <!-- ์ ๋ถ๋ถ ์๋ต -->
<form class="form-area" method="post" action="/sign-up/">
# django์์ ๋ฐ์ดํฐ๋ฅผ post ๋ฐฉ์์ผ๋ก ๋ณด๋ผ ๋ ๋ณด์ ์ง์ผ์ฃผ๊ธฐ ์ํด ์์ฑ
{% csrf_token %}
<!-- ์ค๊ฐ ๋ถ๋ถ ์๋ต -->
<div style="float: right">
<button type="submit" class="btn btn-primary">ํ์๊ฐ์
</button>
<a href="/sign-in" class="btn btn-secondary">๋ก๊ทธ์ธ ํ์ด์ง๋ก</a>
</div>
</form>
<form>
ํ๊ทธ๋ฅผ ํตํด ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ ์ฅํ๋ ๊ฒ์ด๋ค. ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋ <input>
ํ๊ทธ์์ ์ฃผ์ํด์ ๋ณผ ์์ฑ์ name
์ด๋ค. id
๊ฐ์ด ์๋ name
์ ๊ฐ์ด ์ค์ํ๋ค. name
์์ฑ์ ๊ฐ์ธ username, password, password2, bio
๋ฅผ ์ทจํ ๊ฒ์ด๋ค.<div class="form-group mt-2 mb-2">
<label for="username">์ด๋ฆ</label>
<input type="text" class="form-control" id="username" name="username">
</div>
<div class="form-group mt-2 mb-2">
<label for="password">๋น๋ฐ๋ฒํธ</label>
<input type="password" class="form-control" id="password" name="password">
</div>
<div class="form-group mt-2 mb-2">
<label for="password2">๋น๋ฐ๋ฒํธ ํ์ธ</label>
<input type="password" class="form-control" id="password2" name="password2">
</div>
<div class="form-group mt-2 mb-2">
<label for="bio">๋๋ฅผ ํ๋ง๋๋ก</label>
<input type="text" class="form-control" id="bio" name="bio">
</div>
user/views.py
๋ก ๊ฐ์ ๋๋จธ์ง ์์
์ ์งํํ๋๋ก ํ๊ฒ ๋ค. # render๋ฅผ ํตํด์ html์ ํ๋ฉด์ ๋์์ค
from django.shortcuts import render, redirect
# .models: ๋ด๊ฐ ์์นํ๊ณ ์๋ app์์
# UserModel : UserModel์ ๊ฐ์ ธ์ ์ฌ์ฉํ๊ฒ ๋ค.
from .models import UserModel
# ํ์๊ฐ์
def sign_up_view(request):
# ์ฐ๋ฆฌ์ ์ฅ๊ณ ์๋ฒ์๊ฒ ๋ค์ด์ค๋ ์์ฒญ์ ๋ฐ๋ฅธ ํ๋์ ํ๋ค.
# GET ๋ฉ์๋๋ฉด ํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ณ
if request.method == 'GET':
return render(request, 'user/signup.html')
# POST ๋ฉ์๋๋ฉด ์๋์ ์์
๋ค์ ์งํํ๊ฒ ๋ค.
elif request.method == 'POST':
# request.POST๋ก ๊ฑด๋์ค๋ ์ ๋ณด ์ค name='username'์ธ ๊ฒ๋ค์ ์ฌ์ฉํ๊ฒ ๋ค.
# username์ด ์๋ค๋ฉด None(๋น์นธ)์ผ๋ก ์ฒ๋ฆฌํ๊ฒ ๋ค.
username = request.POST.get('username', None)
password = request.POST.get('password', None)
password2 = request.POST.get('password2', None)
bio = request.POST.get('bio', None)
# ๋ง์ฝ ์ด ๋์ด ๊ฐ์ง ์๋ค๋ฉด
if password != password2:
# ๋ค์ ํ์๊ฐ์
ํ๋ฉด์ ๋ณด์ฌ์ค๋ค.
return render(request, 'user/signup.html')
else:
# ๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํ๋ค๋ฉด UserModel์ ์ฌ์ฉํด ํด๋น ๊ฐ๋ค์ ์
๋ ฅ (์์ง ์ ์ฅ๋๊ฑฐ ์๋๋ค!!)
new_user = UserModel()
new_user.username = username
new_user.password = password
new_user.bio = bio
# ์
๋ ฅ๋ ๊ฐ๋ค์ ์ ์ฅํ์!!
new_user.save()
# ํ์๊ฐ์
์ด ๋ง๋ฌด๋ฆฌ๋์์ผ๋ redirect๋ฅผ ์จ์ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ณด๋ด์ฃผ์!!
return redirect('/sign-in')
'์ฌ์ฉ์์ ์ ๋ณด'๋ฅผ ์ ์ฅ
ํ ์ ์๋ session
์ ์ฌ์ฉํ ๊ฒ์ด๋ค. user
app ์ url.py์ views.py
๋ฅผ ์ค์ ํด์ผ ํ๋ค. ํ์ฌ url
์ ์ด๋ฏธ ์ฐ๊ฒฐ์ด ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก user/views.py
๋ฅผ ์์ฑํ๋๋ก ํ๊ฒ ๋ค. #### user/views.py ####
# ํ๋ฉด์ ๊ธ์๋ฅผ ๋์ธ ๋ ์ฌ์ฉ!
from django.http import HttpResponse
def sign_in_view(request):
if request.method == 'POST':
return HttpResponse('๋ก๊ทธ์ธ ์ฑ๊ณต')
elif request.method == 'GET':
return render(request, 'user/signin.html')
templates/user/signin.html
์์ ์์
์ ํ๋๋ก ํ๊ฒ ๋ค. ๋ก๊ทธ์ธ ๋ํ ํ์๊ฐ์
๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก POST
๋ฐฉ์์ ์ฌ์ฉํ๋ค. <form class="form-area" method="post" action="/sign-in/">
{% csrf_token %}
<div class="form-group mt-2 mb-2">
<label for="username">์ด๋ฆ</label>
<input type="text" class="form-control" id="username" name="username">
</div>
<div class="form-group mt-2 mb-2">
<label for="password">๋น๋ฐ๋ฒํธ</label>
<input type="password" class="form-control" id="password" name="password">
</div>
<hr>
<div style="float: right">
<button type="submit" class="btn btn-primary">๋ก๊ทธ์ธ</button>
<a href="/sign-up" class="btn btn-secondary">ํ์๊ฐ์
ํ์ด์ง๋ก</a>
</div>
</form>
user/views.py
๋ก ๋์๊ฐ ์์
์ ๋ง๋ฌด๋ฆฌํ๋ก๋ก ํ๊ฒ ๋ค. <input>
ํ๊ทธ์ name
์์ฑ์ ๊ฐ์ ์ฐ๋ ๊ฒ ๊ผญ ๊ธฐ์ตํ๊ธฐ!!!#### user/views.py ####
# ์๋จ ์๋ต
def sign_in_view(request):
if request.method == 'POST':
# ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๊ฐ๋ค์ ๊ฐ์ ธ์์ ๊ฐ ๋ณ์์ ์ ์ฅ
username = request.POST.get('username', None)
password = request.POST.get('password', None)
# ๊ทธ ๋ค์์ ์ฐ๋ฆฌ๋ ์ ๊ฐ๋ค์ด ํ์๊ฐ์
ํ ๋ ์ ์ฅํ๋ db์ ์๋์ง ํ์ธํด์ผ ํจ
# UserModel์์ ์ฐ๋ฆฌ๋ username์ ๊ฐ์ด ๋ฐ๋ก ์์์ ์ ์ธํ ๋ณ์ username๊ณผ ๊ฐ์ ๊ฑธ me์ ์ ์ฅ
me = UserModel.objects.get(username=username)
# db์์ ๋ถ๋ฌ์จ me์ ์ ์ฅ๋ ๋น๋ฐ๋ฒํธ๋ ์ฌ์ฉ์๊ฐ ๋ฐฉ๊ธ ์น ๋น๋ฐ๋ฒํธ๊ฐ ๊ฐ๋ค๋ฉด
if me.password == password:
# ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ ๊ฒ์ด๋ฏ๋ก ์ธ์
์ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๋ด์์ฃผ๊ณ ๋ฉ์ธ์ง ์ ์ก
request.session['user'] = me.username
return HttpResponse('๋ก๊ทธ์ธ ์ฑ๊ณต')
else:
# ๋ก๊ทธ์ธ์ ์คํจํ๋ฉด ๋ค์ ๋ก๊ทธ์ธ ์๋๋ฅผ ํ ์ ์๊ฒ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ณด๋ด์ค
return redirect('/sign-in')
elif request.method == 'GET':
return render(request, 'user/signin.html')
# ํ์๊ฐ์
def sign_up_view(request):
# ์ฐ๋ฆฌ์ ์ฅ๊ณ ์๋ฒ์๊ฒ ๋ค์ด์ค๋ ์์ฒญ์ ๋ฐ๋ฅธ ํ๋์ ํ๋ค.
# GET ๋ฉ์๋๋ฉด ํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ณ
if request.method == 'GET':
return render(request, 'user/signup.html')
# POST ๋ฉ์๋๋ฉด ์๋์ ์์
๋ค์ ์งํํ๊ฒ ๋ค.
elif request.method == 'POST':
# request.POST๋ก ๊ฑด๋์ค๋ ์ ๋ณด ์ค name='username'์ธ ๊ฒ๋ค์ ์ฌ์ฉํ๊ฒ ๋ค.
# username์ด ์๋ค๋ฉด None(๋น์นธ)์ผ๋ก ์ฒ๋ฆฌํ๊ฒ ๋ค.
username = request.POST.get('username', None)
password = request.POST.get('password', None)
password2 = request.POST.get('password2', None)
bio = request.POST.get('bio', None)
# ๋ง์ฝ ์ด ๋์ด ๊ฐ์ง ์๋ค๋ฉด
if password != password2:
# ๋ค์ ํ์๊ฐ์
ํ๋ฉด์ ๋ณด์ฌ์ค๋ค.
return render(request, 'user/signup.html')
else:
# ํ์๊ฐ์
์ ์๋ํ ์ฌ์ฉ์์ ์์ด๋๊ฐ ์ค๋ณต๋์ง ์๋์ง ํ์ธํด์ผ ๋จ!!!
not_new_user = UserModel.objects.filter(username=username)
if not_new_user:
return render(request, 'user/signup.html')
else:
# ๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํ๋ค๋ฉด UserModel์ ์ฌ์ฉํด ํด๋น ๊ฐ๋ค์ ์
๋ ฅ (์์ง ์ ์ฅ๋๊ฑฐ ์๋๋ค!!)
new_user = UserModel()
new_user.username = username
new_user.password = password
new_user.bio = bio
# ์
๋ ฅ๋ ๊ฐ๋ค์ ์ ์ฅํ์!!
new_user.save()
# ํ์๊ฐ์
์ด ๋ง๋ฌด๋ฆฌ๋์์ผ๋ redirect๋ฅผ ์จ์ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ณด๋ด์ฃผ์!!
return redirect('/sign-in')
f-string
์ ์จ์ ์ฐ๋ฆฌ๊ฐ ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ ์ฌ์ฉ์์ username
์ ์ ์ฅํ me.username
์ ํ๋ฉด์ ๋์ฐ๊ธฐ๋ก ํ๊ณ , ์ฑ๊ณตํ๋ค.def sign_in_view(request):
if request.method == 'POST':
# ์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๊ฐ๋ค์ ๊ฐ์ ธ์์ ๊ฐ ๋ณ์์ ์ ์ฅ
username = request.POST.get('username', None)
password = request.POST.get('password', None)
# ๊ทธ ๋ค์์ ์ฐ๋ฆฌ๋ ์ ๊ฐ๋ค์ด ํ์๊ฐ์
ํ ๋ ์ ์ฅํ๋ db์ ์๋์ง ํ์ธํด์ผ ํจ
# UserModel์์ ์ฐ๋ฆฌ๋ username์ ๊ฐ์ด ๋ฐ๋ก ์์์ ์ ์ธํ ๋ณ์ username๊ณผ ๊ฐ์ ๊ฑธ me์ ์ ์ฅ
me = UserModel.objects.get(username=username)
# db์์ ๋ถ๋ฌ์จ me์ ์ ์ฅ๋ ๋น๋ฐ๋ฒํธ๋ ์ฌ์ฉ์๊ฐ ๋ฐฉ๊ธ ์น ๋น๋ฐ๋ฒํธ๊ฐ ๊ฐ๋ค๋ฉด
if me.password == password:
# ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ ๊ฒ์ด๋ฏ๋ก ์ธ์
์ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๋ด์์ฃผ๊ณ ๋ฉ์ธ์ง ์ ์ก
request.session['user'] = me.username
return HttpResponse(f'๋ฐ๊ฐ์ต๋๋ค, {me.username} ๋!')
else:
# ๋ก๊ทธ์ธ์ ์คํจํ๋ฉด ๋ค์ ๋ก๊ทธ์ธ ์๋๋ฅผ ํ ์ ์๊ฒ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ณด๋ด์ค
return redirect('/sign-in')
elif request.method == 'GET':
return render(request, 'user/signin.html')