TIL_220527_Django ๊ธฐ์ด
Django ๊ธฐ์ด 2์ฃผ์ฐจ ๊ณผ์
Django ๊ธฐ์ด ๊ณผ์ ์์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ค ํ๋ก์ ํธ๋ sns ์ด๋ค.
ํ๋ก์ ํธ ๊ตฌ์กฐ ๋ง๋ค๊ธฐ
Django sns ํ๋ก์ ํธ ๊ธฐ๋ฅ 3๊ฐ์ง
- ์ฌ์ฉ์ ๊ด๋ฆฌ (ํ์๊ฐ์ / ๋ก๊ทธ์ธ/ ๋ก๊ทธ์์)
- ๊ธ์ฐ๊ธฐ
- ์น๊ตฌ๋ง๋ค๊ธฐ
๊ณตํต์ ์ธ ๊ธฐ๋ฅ ๋ถ๋ฅ
- user์ฑ : ์ฌ์ฉ์ ๊ด๋ฆฌ(ํ์๊ฐ์ / ๋ก๊ทธ์ธ/ ๋ก๊ทธ์์)
- tweet์ฑ : ๊ธ ๊ด๋ฆฌ(๊ธ์ฐ๊ธฐ, ์ญ์ , ์์ , ๋๊ธ)์ ๋ด๋น
ํ๋ก์ ํธ ์ธํ
- ํ๋ก์ ํธ ํด๋ ์์ settings.py ํ์ผ์์ ์ถ๊ฐํ ๊ธฐ๋ฅ๋ณ ์ฑ ์ ๋ณด๋ฅผ ์ถ๊ฐ
INSTALLED_APPS = [
'tweet',
'user',
]
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐํ๊ธฐ
- ํ๋ก์ ํธ๋ฅผ ์คํ์์ผ db.sqlite3 ํ์ผ ์์ฑ ํ์ธ
- ์ค๋ฅธ์ชฝ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํญ์ ๋๋ฌ db.sqlite3 ํ์ผ ๋ถ๋ฌ์ค๊ธฐ
- db.sqlite3 ์ ํ์ผ ์ฐ๊ฒฐ์ ํ ์คํธ ํ๊ณ ๋ง์ง๋ง ํ์ธ๊น์ง
ORM์ด๋?
- ORM (Object Relational Mapping) ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ๋์ ๊ฐ์ฒด ๋ฉ์ด๋ฆฌ๋ก ๋ณด๊ณ , ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ SQL ์ธ์ด๊ฐ ์๋ ํด๋์ค๋ก ์ฝ๊ฒ ํํ ๋ฐ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋ค.
- ํํ
class myBakery:
bread_type = '' # ๋นต์ ์ข
๋ฅ
bake_time = '' # ๊ตฝ๋ ์๊ฐ
price = 0 # ๊ฐ๊ฒฉ
User Model ๋ง๋ค๊ธฐ
- ์ฌ์ฉ์๋ฅผ ํ์ ํ ๋ ์ด๋ค ์ ๋ณด๊ฐ ์์ผ๋ฉด ์ข์๊น๋ฅผ ์๊ฐํด๋ณธ๋ค.
- ์ฌ์ฉ์๋ฅผ ๊ตฌ๋ถํ๋ ์ด๋ฆ, ๋น๋ฐ๋ฒํธ, ์ํ๋ฉ์ธ์ง, ์์ฑ์ผ
- User Model ์ ๊ตฌ์กฐ
#user/models.py
from django.db import models
# Create your models here.
class UserModel(models.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)
- django ๋ชจ๋ธ ํ๋์ ์ข ๋ฅ
๋ฌธ์์ด : CharField, TextField
๋ ์ง/์๊ฐ: DateTimeField, DateField, TimeField
์ซ์ : IntegerField, FloatField
๋ค๋ฅธ ํ
์ด๋ธ๊ณผ ์ฐ๊ด์ ์ง์ด ์ค ๋ : ForeignKey
๋ง๋ ๋ชจ๋ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฃ๊ธฐ
1) ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณ๊ฒฝ์ ์๋ ค์ฃผ๋ ๋ช ๋ น์ด : makemigrations
- ํฐ๋ฏธ๋ : python manage.py makemigrations
2) ๋ณ๊ฒฝ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ์ฉ์์ผ์ฃผ๋ ๋ช ๋ น์ด : migrate
- ํฐ๋ฏธ๋ : python manage.py migrate
3) ๋ฐ์ดํฐ๋ฒ ์ด์ค ํญ์ ์ถ๊ฐ๋ ๋ชจ๋ธ ํ์ธ
Django Admin ๊ธฐ๋ฅ
- Django ์ ๋ํ ๊ธฐ๋ฅ์ธ Admin
- Admin ์ ๋ค์ด๊ฐ๊ธฐ ์ํด์๋ ์ํผ ๊ณ์ ์ด ํ์
- Admin ๊ณ์ ์ถ๊ฐ
- ํฐ๋ฏธ๋ : python manage.py createsuperuser
- Admin ํ๋ฉด์ ๋ง๋ Model ๋ฑ๋ก
- user์ฑ์ admin.py ์์ Model ์ ์ฐ๊ฒฐํ๋ ์ฝ๋ ์ ๋ ฅ
from django.contrib import admin
from .models import UserModel
# Register your models here.
admin.site.register(UserModel) # ์ด ์ฝ๋๊ฐ ๋์ UserModel์ Admin์ ์ถ๊ฐ ํด ์ค๋๋ค
Django ๋ง์ ํ ํ๋ฆฟ
- ์น ํ๋ ์์ํฌ์ด๊ธฐ ๋๋ฌธ์ Django๋ HTML์ ๋์ ์ผ๋ก ์์ฑํ ์ ์๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ด ํ์
1) ํ๊ทธ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฝํ ์ธ ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋, ๋ค๋ฅธ ํ ํ๋ฆฟ ํ๊ทธ์ ๋ํ ์ก์ธ์ค๋ฅผ ํ์ฑํ
{% csrf_token %}
2) ๋ค๋ฅธ ์ฌ์ฉ ๋ฐฉ๋ฒ
- ์ฐธ์กฐ : https://docs.djangoproject.com/ko/3.1/topics/templates/
ํ ํ๋ฆฟ | Django ๋ฌธ์ | Django
Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate
docs.djangoproject.com
Template ๋ฅผ view ์ url ์ฐ๊ฒฐ
- ์ฌ์ฉ์๊ฐ url ์์ฒญ → ํฌ๋กฌ/์ฌํ๋ฆฌ ๋ฑ์ ์ธํฐ๋ท ๋ธ๋ผ์ฐ์
- mySpartaSns์ ์์ฒญ์ด ์ ์ → settings.py๊ฐ ์๋ ๊ฐ์ฅ ์ฒ์ ์์ฑํ ์ฑ์ urls.py
- ๋ฑ๋ก๋ url์ ์ฐพ๊ธฐ → urls.py์ ์ฐ๊ฒฐ ๋ ์ฑ์ ์์ฑ ํ urls.py
- ํด๋น url์ ๋ฑ๋ก ๋ view๋ฅผ ์ฐพ๊ธฐ
1) ํต์ฌ ์ฐ๊ฒฐ ํค์๋
- path('', include('user.urls')) user์ฑ์ urls.py์ ์ฐ๊ฒฐ์ํค๊ฒ ๋ค! ๋ผ๊ณ ์ ์ธ ํด ์ฃผ๋ ์ฝ๋
# mySpartaSns/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('user.urls'))
]
2) user ์ urls.py ์ ์ฐ๊ฒฐ ํ user ์ฑ์ views.py ์์ฑ
- url ์ ๋ง๋ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ view.py ์์ฑ
from django.shortcuts import render
# Create your views here.
def sign_up_view(request):
return render(request, 'user/signup.html')
def sign_in_view(request):
return render(request, 'user/signin.html')
3) ์์ฑํ views.py ๋ฅผ urls.py ์ ์ฐ๊ฒฐ
- user์ฑ์ views.py ์ ์์ฑํ ํจ์๋ค์ user ์ url ์ ์ ์ฉ
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'),
]
์ฌ์ฉ์ ๊ด๋ฆฌ์ ๋ก๊ทธ์ธ - ํ์๊ฐ์ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ
1) user ์ views.py ์ sign_up_view ์ POST ์ถ๊ฐ
# user/views.py
def sign_up_view(request):
if request.method == 'GET': # GET ๋ฉ์๋๋ก ์์ฒญ์ด ๋ค์ด ์ฌ ๊ฒฝ์ฐ
return render(request, 'user/signup.html')
elif request.method == 'POST': # POST ๋ฉ์๋๋ก ์์ฒญ์ด ๋ค์ด ์ฌ ๊ฒฝ์ฐ
return ""
2) HTML ์์ form ํ๊ทธ ์ค์
- <formํ๊ทธ> ์ ์์ฑ์ method ์ action ์ ์ถ๊ฐ
- {% csrf_token %} ์ Django ์์ POST ํ ๋ ๋ณด์์ ์ํด์ ์ฌ์ฉ (Django ๋ง์ ํ ํ๋ฆฟ์ ์ฐธ๊ณ )
- ๊ฐ input ์ name ์์ฑ์ ์ ๊ธฐ์ตํด์ post ์ ์ ์ฉ
<!-- ์ ๋ถ๋ถ ์๋ต -->
<div class="wrap">
<h2 class="title-center"> ํ์๊ฐ์
</h2>
<form class="form-area" method="post" action="/sign-up/">
{% 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">
<!-- ์๋ซ ๋ถ๋ถ ์๋ต -->
3) user ์ views.py ์์ ์ ์ก๋๋ ๋ฐ์ดํฐ ๋ฐ์์ ์ ์ฅ
- html ์์ ๋๊ฒจ์ค ๋ฐ์ดํฐ๋ฅผ views.py ์์ ๋ฐ๊ธฐ
- ํจ์ค์๋์ ํจ์ค์๋ ํ์ธ์ด ์ผ์น ์กฐ๊ฑด๋ฌธ ์ ์
- ์ ์์ ์ผ๋ก ํ์๊ฐ์ ์ด ์๋ฃ๋๋ฉด redirect() ๋ฅผ ํตํด ๋ก๊ทธ์ธ ์ฃผ์๋ก ์ฐ๊ฒฐ
from django.shortcuts import render, redirect
from .models import UserModel
def sign_up_view(request):
if request.method == 'GET':
return render(request, 'user/signup.html')
elif request.method == 'POST':
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:
new_user = UserModel()
new_user.username = username
new_user.password = password
new_user.bio = bio
new_user.save()
return redirect('/sign-in')
์ฌ์ฉ์ ๊ด๋ฆฌ์ ๋ก๊ทธ์ธ - ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ
- ์ธ์ : ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ์ ์ฅํ ์ ์๋ค.
1) url, view ์ธํ
- user ์ฑ์ views.py ์ ๋ก๊ทธ์ธ์ ์ฒ๋ฆฌํด ์ค ํจ์ ์์ฑ, url ์ฐ๊ฒฐ
# 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')
2) form ํ๊ทธ ์์ฑ ์ฐ๊ฒฐ
- form ํ๊ทธ์ action ๊ณผ method ์์ฑ ์ถ๊ฐ
<!-- ์๋ถ๋ถ ์๋ต -->
<div class="wrap">
<h2 class="title-center"> ๋ก๊ทธ์ธ</h2>
<form class="form-area" action="/sign-in/" method="post">
{% csrf_token %}
<div class="form-group mt-2 mb-2">
<!-- ์๋ซ ๋ถ๋ถ ์๋ต -->
3) views.py ์์ ํจ์ ์ ์ฉ
- user ์ฑ์ sign_in_view ํจ์์ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ์ถ๊ฐ (+ ์ธ์ )
- post ํ์ธ ์ฌ๋ถ ์กฐ๊ฑด๋ฌธ ์์ฑ
- ์์ด๋์ ํจ์ค์๋ ์ผ์น ์กฐ๊ฑด๋ฌธ ์์ฑ
- ์ ์ฅ๋์ด ์๋ ๋ฐ์ดํฐ์ ์ ๋ณด์ ์ ๋ ฅ ์ ๋ณด๋ฅผ ๋์กฐํด ์ผ์นํ๋ ์กฐ๊ฑด๋ฌธ ์์ฑ
# user/views.py
def sign_in_view(request):
if request.method == 'POST':
username = request.POST.get('username', None)
password = request.POST.get('password', None)
me = UserModel.objects.get(username=username) # ์ฌ์ฉ์ ๋ถ๋ฌ์ค๊ธฐ
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')
์ถ์ฒ ์คํ๋ฅดํ์ฝ๋ฉํด๋ฝ