๐ŸŽ์ ํ”„ ํˆฌ ์žฅ๊ณ  2์žฅ ์ฝ”๋“œ ์ •๋ฆฌ

ํŒ”๋ฆฌ๋™ยท2021๋…„ 3์›” 21์ผ
0

config/url.py

from django.contrib import admin
from django.urls import path, include
from pybo import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('pybo/', include('pybo.urls')),
]
  • ์ฃผ์†Œ์ฐฝ์— ์ฃผ์†Œ๋ฅผ์น˜๊ณ  ์ฃผ์†Œ์˜†์— admin์„ ์น˜๋ฉด ์ž๋™์œผ๋กœ '/'๊ฐ€ ๋ถ™๊ณ  admin.site.urls๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

  • ์ฃผ์†Œ์ฐฝ์— ์ฃผ์†Œ๋ฅผ์น˜๊ณ  ์ฃผ์†Œ์˜†์— pybo๋ฅผ ์น˜๋ฉด ์ž๋™์œผ๋กœ '/'๊ฐ€ ๋ถ™๊ณ 
    pybo ํด๋”์— urls.py์— ์žˆ๋Š”๊ฒƒ๋“ค์ด ์—ฐ๊ฒฐ ๋œ๋‹ค.

    pybo/models.py

from django.db import models

# Create your models here.

class Question(models.Model):
    subject = models.CharField(max_length=200)
    content = models.TextField()
    create_date = models.DateTimeField()
    
    def __str__(self):
        return self.subject

class Answer(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    content = models.TextField()
    create_date = models.DateTimeField()
  • class Question: from django.db์˜ import models์˜ Model ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค.

๋ชจ๋ธ ํด๋ž˜์Šค๋Š” ํ•„๋“œ๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ ํด๋ž˜์Šค ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด๋Š” ๊ทธ ๋ณ€์ˆ˜๊ฐ€ ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ์˜ ๋‚ด์šฉ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ ๋ฉ”ํƒ€ ๋ฐ์ดํƒ€๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

subject = models.CharField(max_length=200):subject์˜ ์ตœ๋Œ€๊ธ€์ž์ˆ˜๋Š” 200์ž
content = models.TextField(): content๋Š” ๊ธ€์ž ์ˆ˜ ์ œํ•œ ์—†์Œ
create_date = models.DateTimeField(): create_date์— ๋‚ ์งœ ์‹œ๊ฐ„ ์ •๋ณด๋ฅผ ์ €์žฅ.

def __str__(self): return self.subject: ํด๋ž˜์Šค๋ฅผ ์†Œํ™˜ํ•  ๋•Œ ํด๋ž˜์Šค์˜ subject๋ฅผ ์†Œํ™˜

  • class Answer: from django.db์˜ import models์˜ Model ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค.

ForeignKey
ForeignKey ๋Š” 1:N ๊ด€๊ณ„๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฒŒ์‹œ๊ธ€๊ณผ ๋Œ“๊ธ€์„ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๊ธ€์—๋Š” ๊ทธ ๊ธ€์— ํ•ด๋‹นํ•˜๋Š” ๋Œ“๊ธ€์ด ์—ฌ๋Ÿฌ ๊ฐœ ์กด์žฌํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ForeignKey ๋ฅผ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค.
django ์—์„œ์˜ ์‚ฌ์šฉ ์˜ˆ์‹œ

class Post(models.Model): 
	#์ƒ๋žต 
class Comment(models.Model):
  post = models.ForeignKey(Post, on_delete=models.CASCADE)

1:N ์ค‘์—์„œ N ์ธ ์ชฝ์—์„œ ๊ด€๊ณ„๋ฅผ ์„ ์–ธํ•ด์ฃผ๋ฉฐ, ๋‘ ๊ฐœ์˜ ์ธ์ž๋ฅผ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๋Œ€์ƒ์ด ๋˜๋Š” ํด๋ž˜์Šค, ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์‚ญ์ œ ์‹œ ์ด์Šˆ์— ๋Œ€ํ•œ ์„ค์ •์ž…๋‹ˆ๋‹ค.
on_delete ์„ค์ •
๊ฐ๊ฐ์— ๋Œ€ํ•œ ์„ค๋ช…์€ 1์ธ ์ชฝ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ญ์ œ ๋˜์—ˆ์„ ์‹œ, N ์ธ ์ชฝ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ง€์— ๋Œ€ํ•œ ์„ค์ •์ž…๋‹ˆ๋‹ค.
CASCADE : ์ด์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋ชจ๋“  N ์ชฝ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
PROTECT : 1์ธ ์ชฝ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ญ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋„๋ก ๋ณดํ˜ธํ•ด์ค๋‹ˆ๋‹ค.
SET_NULL : null ๋กœ ๊ฐ’์„ ๋Œ€์ฒดํ•˜๊ฒŒ ๋˜์–ด ํ•„๋“œ์— null=True ์˜ต์…˜์ด ์žˆ์–ด์•ผ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
SET_DEFAULT : default ๋กœ ๊ฐ’์„ ๋Œ€์ฒดํ•˜๊ฒŒ ๋˜์–ด ํ•„๋“œ์— default=True ์˜ต์…˜์ด ์žˆ์–ด์•ผ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
SET : ๋Œ€์ฒดํ•  ๊ฐ’์ด๋‚˜ ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
DO_NOTHING : ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š์ง€๋งŒ db ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ถœ์ฒ˜:https://ssungkang.tistory.com/entry/Django-๊ด€๊ณ„๋ฅผ-ํ‘œํ˜„ํ•˜๋Š”-๋ชจ๋ธ-ํ•„๋“œ-ForeignKeyOneToOneFieldManyToManyField

question = models.ForeignKey(Question, on_delete=models.CASCADE: question์€ Question๊ณผ ์—ฐ๊ด€๋˜์–ด์žˆ๋‹ค. ๋งŒ์•ฝ Question์ด ์ง€์›Œ์ง€๋ฉด question๋„ ๋‹ค ์ง€์›Œ์ง„๋‹ค.

pybo/urls.py


from django.urls import path
from . import views

#app์ด๋ฆ„์€ pybo 
app_name = 'pybo'

urlpatterns = [
# ์ฃผ์†Œ/pybo๋ผ๊ณ  ์น˜๋ฉด views์˜ index ํ•จ์ˆ˜ ์‹คํ–‰ 
    path('', views.index, name='index'),
# ์ฃผ์†Œ/pybo/question.id	์˜ ๊ฐ’์„ intํ˜•์œผ๋กœ ๋ฐ”๊พผ๊ฒƒ ์„ ์น˜๋ฉด views์˜ detailํ•จ์ˆ˜ ์‹คํ–‰ 
    path('<int:question_id>/', views.detail,name='detail'),
 # ์ฃผ์†Œ/pybo/answer/create/<int:question_id/ ๋ฅผ ์น˜๋ฉด answer_create ํ•จ์ˆ˜ ์‹คํ–‰ 
    path('answer/create/<int:question_id>/', views.answer_create, name='answer_create'), 
# ์ฃผ์†Œ question/create/๋ฅผ ์น˜๋ฉด uestion_create ํ•จ์ˆ˜ ์‹คํ–‰
    path('question/create/', views.question_create, name='question_create'),
]

pybo/views.py

from django.shortcuts import render, get_object_or_404, redirect
from django.http import HttpResponse
from .models import Question
from django.utils import timezone
from .forms import QuestionForm, AnswerForm

# Create your views here.

def index(request):
    """
    pybo ๋ชฉ๋ก ์ถœ๋ ฅ
    """
    #question_list๋Š” Question๋ชจ๋ธ์˜ object๋ฅผ create-date์—ญ์ˆœ์œผ๋กœ ์ •๋ ฌ
    question_list = Question.objects.order_by('-create_date')
    #context๋Š” dicํ˜•ํƒœ๋กœ ์ €์žฅ 
    context = {'question_list': question_list}
    # ๋ Œ๋”๋ง 'pybo/question_list.html'์— ์ง€์—ญ๋ณ€์ˆ˜ context ์ „๋‹ฌ 
    return render(request, 'pybo/question_list.html',context)

def detail(request,question_id):
    """
    pybo๋‚ด์šฉ์ถœ๋ ฅ
    """
    # ์ธ์šฉ ์ฐธ์กฐ 
    question = get_object_or_404(Question, pk=question_id)
    context = {'question':question}
    return render(request,'pybo/question_detail.html',context)

def answer_create(request,question_id):
    """
    pybo ๋‹ต๋ณ€๋“ฑ๋ก
    """
    question = get_object_or_404(Question, pk=question_id)
    # ๋ฆฌํ€˜์ŠคํŠธ ๋ฐ›์€ form์˜ ๋ฉ”์˜๋“œ๊ฐ€ POST๋ผ๋ฉด 
    if request.method == "POST":
        form = AnswerForm(request.POST)
        if form.is_valid():
            answer = form.save(commit=False)
            answer.create_date = timezone.now()
            answer.question = question
            answer.save()
            return redirect('pybo:detail', question_id=question.id)
    else:
        form = AnswerForm()
    context = {'question':question,'form':form}
    return render(request, 'pybo/question_detail.html',context)

def question_create(request):
    """
    pybo ์งˆ๋ฌธ๋“ฑ๋ก
    """
    if request.method == 'POST':
        form = QuestionForm(request.POST)
        if form.is_valid():
            question = form.save(commit=False)
            question.create_date = timezone.now()
            question.save()
            return redirect('pybo:index')
    else:
        form = QuestionForm()
    context = {'form': form}
    return render(request, 'pybo/question_form.html', context)


์ถœ์ฒ˜:https://docs.djangoproject.com/ko/3.1/intro/tutorial03/

profile
๋ฐฐ์›€์˜ ๊ธฐ๋ก

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