๐Ÿ“’ Django ๊ณต๋ถ€ 2์ผ์ฐจ

๊น€ํƒœ์ธยท2022๋…„ 5์›” 26์ผ
0

Django

๋ชฉ๋ก ๋ณด๊ธฐ
2/10
post-thumbnail

2์ฃผ์ฐจ ๋ฐฐ์šธ ๊ฒƒ

  • Django ์‹คํ–‰ ๋ฐ ๊ด€๋ฆฌ ๋ช…๋ น์–ด
  • Django ORM / Database ์—ฐ๋™
  • Admin ๊ธฐ๋Šฅ
  • ์‚ฌ์šฉ์ž ๋ชจ๋ธ์„ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌ๊ธฐ๋Šฅ ๊ตฌํ˜„ (ํšŒ์›๊ฐ€์ž… / ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ)

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

  • URL Conf = urls.py (ํŒŒ์ด์ฌ ๋‚ด ์ž‘์—…๊ณต๊ฐ„) : ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ์ฃผ์†Œ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ •ํ•ด์ฃผ๋Š” ๊ณต๊ฐ„

  • view = views.py (ํŒŒ์ด์ฌ ๋‚ด ์ž‘์—…๊ณต๊ฐ„) : URL์—์„œ ์–ด๋–ค ์—ญํ• ๊ณผ ์ˆ˜ํ–‰์„ ํ•  ๊ฒƒ์ธ์ง€ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ณต๊ฐ„

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

  • ์‚ฌ์šฉ์ž์™€ ๊ธ€๋กœ ๋‚˜๋ˆ„์–ด ์ƒ๊ฐ
ํ„ฐ๋ฏธ๋„์—์„œ ํ•ด๋‹น ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์•ฑ ์ƒ์„ฑ

django-admin startapp user
django-admin startapp tweet
  • user์•ฑ - ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ (ํšŒ์›๊ฐ€์ž…/๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ)๋‹ด๋‹น
  • tweet์•ฑ - ๊ธ€ ๊ด€๋ฆฌ( ๊ธ€์“ฐ๊ธฐ, ์‚ญ์ œ, ์ˆ˜์ •, ๋Œ“๊ธ€)๋‹ด๋‹น
  • ์ดํ›„ user, tweet์— ์•ฑ์„ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  setting.py์— ์•Œ๋ ค์ฃผ์–ด์•ผํ•จ

settings.py = ์žฅ๊ณ  ํ”„๋กœ์ ํŠธ๊ฐ€ ์–ด๋–ค ๊ธฐ๋Šฅ๊ณผ ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์„ธํŒ…ํ•˜๋Š” ๊ณณ

(์„ธํŒ… ์ถ”๊ฐ€ ์‚ฌ์ง„)

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ Django ORM

  • ORM ์ด๋ž€?
    Object Relational Mapping ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ•˜๋‚˜์˜ '๊ฐ์ฒด(Object)' ๋ฉ์–ด๋ฆฌ๋กœ ๋ณด๊ณ 
    ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ SQL ์–ธ์–ด๊ฐ€ ์•„๋‹Œ ํด๋ž˜์Šค๋กœ ์‰ฝ๊ฒŒ ํ‘œํ˜„, ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ
class myBakery:
    bread_type = ''  # ๋นต์˜ ์ข…๋ฅ˜
    bake_time = ''  # ๊ตฝ๋Š” ์‹œ๊ฐ„
    price = 0  # ๊ฐ€๊ฒฉ

์œ„์™€ ๊ฐ™์€ ํด๋ž˜์Šค์˜ ํ˜•ํƒœ๋ฅผ
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ ORM์ด๋ผ๊ณ  ํ•จ

๋ชจ๋ธ ๋งŒ๋“ค๊ธฐ

  • ์ƒ์„ฑํ• ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฌํ•ญ
  1. ์–ด๋–ค ๋ชจ๋ธ์„ ์ƒ์„ฑํ• ๊ฒƒ์ธ๊ฐ€?
  2. ์–ด๋–ค ์š”์†Œ๋“ค์„ ๋‹ด์„ ๊ฒƒ์ธ๊ฐ€?

์œ„์— ๋ชจ๋ธ Class ์—์„œ
Class Meta ๋Š” ์ด DBํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•ด์ฃผ๋Š” ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ์Œ

Django ๋ชจ๋ธ ํ•„๋“œ ์ข…๋ฅ˜

  • ๋ฌธ์ž์—ด : CharField, TextField
    ๋‚ ์งœ/์‹œ๊ฐ„: DateTimeField, DateField, TimeField
    ์ˆซ์ž : IntegerField, FloatField
    ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”๊ณผ ์—ฐ๊ด€์„ ์ง€์–ด ์ค„ ๋•Œ : ForeignKey

๋งŒ๋“  ๋ชจ๋ธ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ๋„ฃ๊ธฐ

๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ๋„ฃ์–ด์ฃผ๋Š” ๋‘ ๋‹จ๊ณ„

<ํ„ฐ๋ฏธ๋„์— ์ž…๋ ฅ>

a. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณ€๊ฒฝ์„ ์•Œ๋ ค์ฃผ๋Š” ๋ช…๋ น์–ด

python manage.py makemigrations

b. ๋ณ€๊ฒฝ๋œ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ๋ฐ˜์˜ ํ•ด ์ฃผ๋Š” ๋ช…๋ น์–ด

python manage.py migrate

Django Admin ๊ธฐ๋Šฅ ์ฒดํ—˜ํ•˜๊ธฐ

django super user ์ƒ์„ฑ ๋ช…๋ น์–ด

python manage.py createsuperuser

admin ๋ชจ๋ธ ๋“ฑ๋กํ•˜๊ธฐ

user/admin.py ์— ๋ชจ๋ธ ๋“ฑ๋ก

from django.contrib import admin 
#์žฅ๊ณ ์—์„œ ์–ด๋“œ๋ฏผ ํˆด์„ ์‚ฌ์šฉ ํ•˜๊ฒ ๋‹ค

from .models import UserModel 
#์šฐ๋ฆฌ์˜ ์œ„์น˜์™€ ๋™์ผํ•˜๊ฒŒ ์žˆ๋Š” models ๋ผ๋Š” ํŒŒ์ด์ฌ ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ค๊ฒ ๋‹ค

# Register your models here.
admin.site.register(UserModel) 
# ๋ฐฉ๊ธˆ ๊ฐ€์ ธ์˜จ UserModel์„ Admin์— ์ถ”๊ฐ€ํ•ด ์ฃผ๊ฒ ๋‹ค

ForeignKey ๋ž€?

๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜ค๊ฒ ๋‹ค๋Š” ๊ฒƒ

์ˆœ์„œ ์ด์ •๋ฆฌ

๋ชจ๋ธ ์ƒ์„ฑ -> (์„œ๋ฒ„๊ฐ€ ๊บผ์ง„ ์ƒํƒœ์—์„œ) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฝ์ž… -> admin์— ๋ชจ๋ธ ๋“ฑ๋ก


์žฅ๊ณ  ํ…œํ”Œ๋ฆฟ ๋ฌธ๋ฒ• {%

  1. ์ค‘๋ณตํ•ด์„œ html์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋˜๋„๋ก ํ•จ
  2. htmlํŒŒ์ผ์„ ์ด์–ด์„œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์คŒ
  3. html ํŒŒ์ด์ฌ์˜ ๊ธฐ๋Šฅ๋“ค์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฌธ๋ฒ•

์˜ˆ์‹œ)
base.html ์„ {% %}๋กœ ๊ฐ์‹ธ์ค˜ ์ค‘๋ณตํ•˜์—ฌ html์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋˜๋„๋ก ํ•จ


url - view - templates ์ด์–ด์ฃผ๊ธฐ

django MTV๋ฅผ ์ƒ๊ฐํ•˜๋ฉฐ ์ดํ›„ ์ง„ํ–‰ ์‚ฌํ•ญ์„ ์ƒ๊ฐ

์ดํ›„ ์ง„ํ–‰ํ•ด์•ผ ํ•  ๋„์‹ํ™”

{% csrf_token %}
์žฅ๊ณ ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ post๋กœ ๋ณด๋‚ผ ๋•Œ ๋ณด์•ˆ์„ ์ง€์ผœ์ฃผ๋Š” ๊ธฐ๋Šฅ

๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ

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')

๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ

  • ์„ธ์…˜์ด๋ž€ ? '์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„'
    ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด์— '์š”์ฒญ'๊ณผ '์‘๋‹ต'์„ ํ•˜๋Š”๋ฐ
    ๊ทธ๋•Œ ๊ฐ™์€ ์‚ฌ๋žŒ์ด ์š”์ฒญ์„ ํ•˜๋Š”์ง€ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฒƒ์„ ์„ธ์…˜์ด๋ผ๊ณ  ํ•จ
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')

ํšŒ์›๊ฐ€์ž… ์ค‘๋ณต ๋ฐฉ์ง€

 exist_user = UserModel.object.filter(username=username)
            if exist_user:
                return render(request, 'user/signup.html')

object.filter / object.get ์ฐจ์ด

  1. object.filter ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋‚˜ ์—†์œผ๋‚˜
    ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š์Œ

    ์žˆ์œผ๋ฉด ๊ฐ€์ง€๊ณ ์˜ค๊ณ , ์—†์œผ๋ฉด ์—†์Œ์œผ๋กœ ํ‘œ์‹œ

  2. object.get ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌด์กฐ๊ฑด ์žˆ์–ด์•ผํ•จ
    ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋‹ค๋ฉด ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ด

profile
์ฝ”๋”ฉ์ด ์ทจ๋ฏธ๊ฐ€ ๋˜๋Š” ๊ทธ๋‚ ๊นŒ์ง€

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

comment-user-thumbnail
2022๋…„ 5์›” 28์ผ

ํƒœ์ธ๋‹˜~ ์ค‘์š”ํ•œ ์ฝ”๋“œ๋Š” ์ •๋ฆฌํ•˜๋ฉด์„œ ๊ณต๋ถ€ํ•˜๊ณ  ๊ณ„์‹  ์ ์ด ์ •๋ง ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค! ์•ž์œผ๋กœ์˜ ์žฅ๊ณ  ๊ณต๋ถ€๋„ ํ™”์ดํŒ…์ž…๋‹ˆ๋‹ค!

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ