🍎ジャンプ2章コードの整理


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モデルのモデルクラスを継承します.
  • モデルクラスは、インスタンス変数ではなくクラス変数を使用してフィールドを定義します.これは、テーブル列の内容ではなく、テーブルの列メタデータを定義するためです.subject = models.CharField(max_length=200):主語の最大文字数は200個content = models.TextField():内容は文字数に制限されませんcreate_date = models.DateTimeField():create dateは日付時間情報を格納します. def __str__(self): return self.subject:召喚クラス時に召喚クラスの本体
  • class Answer: from django.dbのimportモデルのモデルクラスを継承します.
  • ForeignKey
    ForeignKeyは1:N関係を表す.たとえば、投稿やコメントを考慮できます.1つの文章にはそれに対応するコメントが複数あるので、ForeignKeyに満足しています.
    djangoでの使用例
    class Post(models.Model): 
    	#생략 
    class Comment(models.Model):
      post = models.ForeignKey(Post, on_delete=models.CASCADE)
    関係を宣言するには、1:NからNまでの2つのパラメータが必要です.1つはターゲットクラスで、もう1つは削除時のホットスポットの設定です.on_delete設定
    各説明は、一方のデータを削除した場合、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-関係を表す-モデル-フィールド-F oreignKeyOneOneFieldManyToManyFieldquestion = models.ForeignKey(Question, on_delete=models.CASCADE:問題は問題と関係がある.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/