MVMT 2023. 1. 1. 01:08

Django ๊ธฐ์ดˆ 2์ฃผ์ฐจ ๊ณผ์ •

Django ๊ธฐ์ดˆ ๊ณผ์ •์—์„œ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค ํ”„๋กœ์ ํŠธ๋Š” sns ์ด๋‹ค.

 

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ๋งŒ๋“ค๊ธฐ

Django ๊ฐ€ ์ผํ•˜๋Š” ์ˆœ์„œ

 

Django sns ํ”„๋กœ์ ํŠธ ๊ธฐ๋Šฅ 3๊ฐ€์ง€

  • ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ (ํšŒ์›๊ฐ€์ž…/ ๋กœ๊ทธ์ธ/ ๋กœ๊ทธ์•„์›ƒ)
  • ๊ธ€์“ฐ๊ธฐ
  • ์นœ๊ตฌ๋งŒ๋“ค๊ธฐ

 

๊ณตํ†ต์ ์ธ ๊ธฐ๋Šฅ ๋ถ„๋ฅ˜

  • user์•ฑ : ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ(ํšŒ์›๊ฐ€์ž…/ ๋กœ๊ทธ์ธ/ ๋กœ๊ทธ์•„์›ƒ)
  • tweet์•ฑ : ๊ธ€ ๊ด€๋ฆฌ(๊ธ€์“ฐ๊ธฐ, ์‚ญ์ œ, ์ˆ˜์ •, ๋Œ“๊ธ€)์„ ๋‹ด๋‹น

 

ํ”„๋กœ์ ํŠธ ์„ธํŒ…

- ํ”„๋กœ์ ํŠธ ํด๋” ์•ˆ์˜ settings.py ํŒŒ์ผ์—์„œ ์ถ”๊ฐ€ํ•œ ๊ธฐ๋Šฅ๋ณ„ ์•ฑ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€

INSTALLED_APPS = [
    'tweet',
    'user',
]

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐํ•˜๊ธฐ

  1. ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰์‹œ์ผœ db.sqlite3 ํŒŒ์ผ ์ƒ์„ฑ ํ™•์ธ
  2. ์˜ค๋ฅธ์ชฝ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํƒญ์„ ๋ˆŒ๋Ÿฌ db.sqlite3 ํŒŒ์ผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
  3. 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 ์—ฐ๊ฒฐ

  1. ์‚ฌ์šฉ์ž๊ฐ€ url ์š”์ฒญ → ํฌ๋กฌ/์‚ฌํŒŒ๋ฆฌ ๋“ฑ์˜ ์ธํ„ฐ๋„ท ๋ธŒ๋ผ์šฐ์ €
  2. mySpartaSns์— ์š”์ฒญ์ด ์ ‘์ˆ˜ → settings.py๊ฐ€ ์žˆ๋Š” ๊ฐ€์žฅ ์ฒ˜์Œ ์ž‘์„ฑํ•œ ์•ฑ์˜ urls.py
  3. ๋“ฑ๋ก๋œ url์„ ์ฐพ๊ธฐ → urls.py์— ์—ฐ๊ฒฐ ๋œ ์•ฑ์— ์ƒ์„ฑ ํ•œ urls.py
  4. ํ•ด๋‹น 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')

 

์ถœ์ฒ˜ ์ŠคํŒŒ๋ฅดํƒ€์ฝ”๋”ฉํด๋Ÿฝ