Python/Django Framework

[Python Django] 3-3. CBV FromView ForeignKey 연결

Jake the Dog 2022. 3. 26. 09:39
반응형

게시판을 작성하면서 작성자 정보를 저장하지 않았었는데, 이 부분 수정하면서 다른 테이블과의 연결에대해 알아봅니다.

model.py 수정

  • insert_user를 ForeignKey로 지정
  • on_delete=models.CASCADE 설정은 외래 키로 지정된 데이터가 삭제되었을 때 대한 데이터 역시 삭제해준다는 설정이다
# board/models.py

from django.db import models


class Board(models.Model):
    title = models.CharField(max_length=256, verbose_name="제목")
    contents = models.TextField(verbose_name="내용")

    insert_user = models.ForeignKey('user.User', verbose_name="작성자", on_delete=models.CASCADE) # 추가
    insert_date = models.DateTimeField(auto_now_add=True, verbose_name="작성일")
    update_date = models.DateTimeField(auto_now=True, verbose_name="수정일", null=True)

    def __str__(self):
        return self.title

    class Meta:
        db_table = 't_board'
        verbose_name = "게시판"
        verbose_name_plural = "게시판 목록"

마이그레이션 진행

$ python3 manage.py makemigrations
$ python3 manage.py migrate

views.py 수정

  • 로그인 정보를 통해 작성자 저장되도록 수정
  • 로그인이 안되어있을시 로그인 화면으로 이동
  • 로그인되어있지만 user 정보가 없을 때 로그아웃 페이지로 이동
  • 로그인된 session의 정보는 form_valid 함수를 오버라이드할때 form 내부에서 접근한다
# board/views.py

from django.shortcuts import redirect
from django.views.generic import FormView, DetailView, ListView

from board.forms import BoardCreateForm
from board.models import Board
from user.models import User


class BoardCreateView(FormView):
    template_name = "board_create.html"
    form_class = BoardCreateForm
    success_url = "/board/create/"

    def form_valid(self, form):
        # user 정보 취득
        user_id = self.request.session.get('user_id')
        if user_id:
            try:
                user = User.objects.get(pk=user_id)
            except User.DoesNotExist:
                return redirect("/user/login/")
        else:
            return redirect("/user/logout/")

        board = Board(
            title=form.data.get('title'),
            contents=form.data.get('contents'),
            insert_user=user

        )
        board.save()
        return super().form_valid(form)


class BoardDetailView(DetailView):
    template_name = "board_detail.html"
    model = Board  # URLConf에서 pk 파라미터의 값을 활용하여 자동으로DB를 조회한다
    context_object_name = "board"
반응형