[๋ณต์Šต/0528] Django project

nikevapormaxยท2022๋…„ 5์›” 28์ผ
0

WIL

๋ชฉ๋ก ๋ณด๊ธฐ
7/8

๐Ÿคฆโ€โ™‚๏ธ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ๋งŒ๋“ค๊ธฐ

๐Ÿคทโ€โ™‚๏ธ django๊ฐ€ ์ผํ•˜๋Š” ์ˆœ์„œ ๋ฆฌ๋งˆ์ธ๋“œ

๐Ÿคทโ€โ™‚๏ธ app ์ƒ์„ฑ

  • ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค sns ํ”„๋กœ์ ํŠธ์—์„œ ํ•„์ˆ˜์ ์ธ ๊ธฐ๋Šฅ ๋‘ ๊ฐ€์ง€๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.
    • user : ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ (ํšŒ์›๊ฐ€์ž… / ๋กœ๊ทธ์ธ ๋˜๋Š” ๋กœ๊ทธ์•„์›ƒ)
    • tweet : ๊ธ€ ๊ด€๋ฆฌ (๊ธ€ ์“ฐ๊ธฐ, ์ˆ˜์ •, ์‚ญ์ œ / ๋Œ“๊ธ€)

- ์•ฑ ์ƒ์„ฑ ์ฝ”๋“œ (ํ„ฐ๋ฏธ๋„์—์„œ ์ž‘์„ฑ)

  • ์ฝ”๋“œ ๊ตฌ์กฐ : django-admin startapp (์•ฑ์ด๋ฆ„)
$ django-admin startapp user
$ django-admin startapp tweet

- ์ƒ์„ฑ๋œ ์•ฑ setting

  • app์„ ํ„ฐ๋ฏธ๋„์—์„œ ๋งŒ๋“ค๊ณ , ์˜†์— ํ”„๋กœ์ ํŠธ ํƒ์ƒ‰๊ธฐ์— app์ด ์ƒ๊ฒผ๋‹ค๊ณ  ํ•ด์„œ ๋์ด ์•„๋‹ˆ๋‹ค.
  • django๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  app์„ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ธํŒ…ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
  • ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์šฐ๋ฆฌ๋Š” ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ์„ฑ๋˜์–ด ์žˆ๋˜ app ์•ˆ์— ์žˆ๋Š” 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๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋‹ค๋ฉด ์—ฐ๊ฒฐ์ด ์ž˜ ๋œ๊ฒƒ์ด๋‹ค.

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ˆˆ์œผ๋กœ ํ™•์ธํ•ด๋ณด์ž.

    • ์˜ค๋ฅธ์ชฝ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋ฆญ ํ›„, [+ ๋ฒ„ํŠผ] - ๊ฒฝ๋กœ ๋ฐ์ดํ„ฐ ์†Œ์Šค ์„ ํƒ

    • ์ฒซ ๋ฒˆ์งธ๋กœ ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฆ„์„ ํ™•์ธํ•˜๊ณ , ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ ํƒ

    • ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋งž๊ฒŒ ์„ ํƒํ•˜๊ณ  ํ™•์ธ

    • ์ƒ๋‹จ์€ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ํ•˜๋‹จ์˜ ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ ๋ถ€๋ถ„์— ์ง‘์ค‘

      • ๋งŒ์•ฝ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์—†๋‹ค๋ฉด ๋‹ค์šด๋กœ๋“œ ๋ฐ›๊ธฐ
      • ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ๋ฅผ ๋ˆŒ๋Ÿฌ ์—ฐ๊ฒฐ ์—ฌ๋ถ€ ํ™•์ธ
      • ์™„๋ฃŒ๋˜๋ฉด ์ ์šฉ์„ ๋ˆ„๋ฅด๊ณ  ํ™•์ธ ํด๋ฆญ
    • ์œ„์˜ ๊ณผ์ •์„ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉด ์•„๋ž˜์˜ ์ฐฝ์ด ์ƒ์„ฑ๋จ

      • console์€ ๊ทธ๋ƒฅ ๋„๊ธฐ

๐Ÿคทโ€โ™‚๏ธ User model ์ƒ์„ฑํ•˜๊ธฐ

  • django๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ 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)
    

๐Ÿคทโ€โ™‚๏ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ชจ๋ธ ๋„ฃ๊ธฐ

  • django๋Š” ์–ด๋–ค ๊ฒƒ์„ ๋งŒ๋“ค๊ฒŒ ๋˜๋ฉด ์•Œ๋ ค์ค˜์•ผ ํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๊ฒŒ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๋ชจ๋ธ์„ ์•Œ๋ ค์ฃผ์ž.
  • ์ฒซ ๋ฒˆ์งธ๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณ€๊ฒฝ์„ ์•Œ๋ ค์ฃผ๋Š” ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. (ํ„ฐ๋ฏธ๋„)
$ python manage.py makemigrations  
  • ๋‘ ๋ฒˆ์งธ๋กœ, ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ฐ˜์˜ํ•ด ์ฃผ๋Š” ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
$ python manage.py migrate  

  • ์ด์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ชจ๋ธ์ด ์ž˜ ๋“ค์–ด๊ฐ”๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.
    • ๋จผ์ € ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฐฝ์„ ์—ด๊ณ  ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•œ๋‹ค.
    • ์šฐ๋ฆฌ๊ฐ€ meta ํด๋ž˜์Šค์—์„œ ์„ ์–ธํ•œ ๋ชจ๋ธ์˜ ์ด๋ฆ„์„ ์ฐพ๋Š”๋‹ค.

๐Ÿคฆโ€โ™‚๏ธ admin ๊ธฐ๋Šฅ

  • django์—์„œ ๋งŒ๋“ค์–ด์ค€ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€

๐Ÿคทโ€โ™‚๏ธ ์ ‘์† ๋ฐฉ๋ฒ•

  • django project๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค.
  • ์•„๋ž˜ ์‹คํ–‰ ๋ฉ”์„ธ์ง€ ์ค‘ 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 ๋“ฑ๋ก

  • ์•ž์—์„œ ์ƒ์„ฑํ•œ 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)
  • admin ํŽ˜์ด์ง€์— ๊ฐ€์„œ ๋“ฑ๋ก ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค.
  • ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” + Add๋ฅผ ๋ˆŒ๋Ÿฌ user๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์šฐ๋ฆฌ๊ฐ€ UserModel ์•ˆ์— ์ƒ์„ฑํ–ˆ๋˜ ์š”์†Œ๋“ค์ด ๋“ค์–ด๊ฐ€ ์žˆ๋‹ค.
    • ์—ฌ๊ธฐ์„œ created_at๊ณผ updated_at์€ django์—์„œ ์ž๋™์œผ๋กœ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค.

๐Ÿคฆโ€โ™‚๏ธ Tweet model ์ƒ์„ฑ

  • ๊ธ€์“ฐ๊ธฐ์™€ ๊ด€๋ จํ•ด ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์ƒ๊ฐํ•ด๋ณด์ž.
    • ์ž‘์„ฑ์ž, ๋‚ด์šฉ, ๊ธ€ ์ƒ์„ฑ์ผ์ž, ์ˆ˜์ •์ผ์ž

๐Ÿคทโ€โ™‚๏ธ ๋ชจ๋ธ ์ž‘์„ฑ

  • 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 model์„ admin์— ๋“ฑ๋ก

  • tweet/admin.py์— tweet model์„ ๋“ฑ๋กํ•œ๋‹ค.
from django.contrib import admin
from .models import TweetModel

admin.site.register(TweetModel)
  • admin ํŽ˜์ด์ง€์—์„œ ๋ชจ๋ธ ์ ์šฉ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค.

๐Ÿคฆโ€โ™‚๏ธ ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ

๐Ÿคทโ€โ™‚๏ธ ํ™”๋ฉด ๋„์šฐ๊ธฐ

- html ํŒŒ์ผ ์ž‘์„ฑ

  • ์—ฌ๋Š๋•Œ์™€ ๊ฐ™์ด ํ™”๋ฉด์„ ๋„์šฐ๊ธฐ ์œ„ํ•ด์„œ 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์˜ ๋‚ด์šฉ์„ ์ ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

- django์˜ MVT ํŒจํ„ด์„ ๊ณ ๋ คํ•œ ์ง„ํ–‰

  • ์œ„์—์„œ ์šฐ๋ฆฌ์˜ template์˜ ์ž‘์„ฑ์ด ๋๋‚˜๊ฒŒ ๋˜์—ˆ๋‹ค. django์˜ MVT ํŒจํ„ด์— ๋”ฐ๋ผ view, url ์„ ์ž‘์„ฑํ•ด ๊ฐ ํ…œํ”Œ๋ฆฟ๋“ค์„ ์—ฐ๊ฒฐํ•ด์ฃผ๊ณ  ์–ด๋–ค ์—ญํ• ์„ ํ•ด์•ผํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์„ค์ •ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.
  • ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ง„ํ–‰๋œ๋‹ค.

- ์ง„ํ–‰ ์ˆœ์„œ

  • user.urls.py ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ
    • ์šฐ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€ํ•  app๋“ค์˜ url์„ 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>
  • html ํŒŒ์ผ ์„ธํŒ…์ด ๋๋‚ฌ์œผ๋‹ˆ, ๋‹ค์‹œ 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')
  • ๋กœ๊ทธ์ธ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ , ์„ฑ๊ณตํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ™”๋ฉด์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

๐Ÿคฆโ€โ™‚๏ธ 2์ฃผ์ฐจ ์ˆ™์ œ

๐Ÿคทโ€โ™‚๏ธ ๋™์ผํ•œ ์‚ฌ์šฉ์ž์˜ ํšŒ์›๊ฐ€์ž… ์ฐจ๋‹จ

  • django์˜ filter ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ค‘๋ณต๋œ ์•„์ด๋”” ๊ฐ’์ธ์ง€ ํ™•์ธํ•˜์˜€๋‹ค.
# ํšŒ์›๊ฐ€์ž…
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')

profile
https://github.com/nikevapormax

0๊ฐœ์˜ ๋Œ“๊ธ€