Django-mysite만들기7 계층형 답글 게시판 기능 추가

|

django mini project

cafe24신입사원 교육과정 - django 수업 내용 정리

강사님github


전체 코드 보기


board app 추가 ! python manage.py startapp board

settings.py 에 app 추가

[1] 1(user):N(board) 관계 Model 정의

board/models.py

views
db-schema
from django.db import models

# Create your models here.
from user.models import User


class Board(models.Model):
    title = models.CharField(max_length=100)
    content = models.CharField(max_length=2000)
    hit = models.IntegerField(default=0)
    regdate = models.DateTimeField(auto_now=True)
    groupno = models.IntegerField(default=0)
    orderno = models.IntegerField(default=0)
    depth = models.IntegerField(default=0)
    user = models.ForeignKey(User, to_field='id', on_delete=models.CASCADE)
    # user모델의 id를 fk로, user가 지워지면 같이 삭제

user model정의 보기

계층형 게시판을 위해서,

groupno, orderno, depth 컬럼을 정의해 주었다.

groupno 컬럼 - 첫 게시글과, 그 게시글의 답글들에게 같은 groupno을 주어서 보여주기 위함

orderno 컬럼 - 같은 groupno의 게시글들을 최신순으로 위로 올리기 위함

depth 컬럼 - 답글들을 한 칸씩 밀려서 보이게 하기 위함

views

admin.py등록

from board.models import Board
admin.site.register(Board)

python manage.py makemigrations

python manage.py migrate



[2] urls.py

urlpatterns = [
   ...
    path('board/list/<int:page>', board_views.list),
    path('board/list/', board_views.list),
    path('board/writeform', board_views.writeform),
    path('board/writeform/<int:no>', board_views.writeform),
    path('board/write', board_views.write),
    path('board/<int:no>', board_views.view),
    path('board/modify/<int:no>', board_views.modifyform),
    path('board/modify', board_views.modify),
    path('board/delete/<int:no>', board_views.delete),
	...
]

[3] views.py

게시글 작성

# 글쓰기 폼으로 보내는 
# url에서 no을 확인해 -1인 경우는 새글쓰기, 그외에는 해당no 게시글의 답글쓰기로 판별
def writeform(request, no=-1):
    if no == -1:
        return render(request, 'board/write.html')
    else:
        return render(request, 'board/write.html', {"no":no})

def write(request):
    board = Board()
    board.title = request.POST['title']
    board.content = request.POST['content']
    board.user = User.objects.get(id=request.session['authUser']['id'])

    # 새글 작성일 경우
    if request.POST['no'] == '-1':
        value = Board.objects.aggregate(max_groupno=Max('groupno'))
        board.groupno = value["max_groupno"]+1
        board.save()
    # 답글 작성일 경우 orderno, groupno, depth 설정
    else:
        board2 = Board.objects.get(id=request.POST['no'])
        # 답글이 작성될 경우, 작성되는 답글의 orderno+1보다 크거나 같은 그룹 내의 이전 게시글의 orderno을 +1씩 올려주어야 한다.
        Board.objects.filter(orderno__gte=board2.orderno+1).update(orderno=F('orderno') + 1)
        board.groupno = board2.groupno
        board.orderno = board2.orderno+1
        board.depth = board2.depth+1
        board.save()

    return HttpResponseRedirect('list')

글 상세보기

def view(request, no=0):
    if no == 0: return HttpResponseRedirect('list')

    board = Board.objects.filter(id=no)
    board.update(hit=F('hit')+1)
    data = {
        'board':board[0]
    }
    return render(request, 'board/view.html', data)

수정 및 삭제

def modifyform(request, no=0):
    board = Board.objects.filter(id=no)[0]
    data = {
        'board':board
    }
    return render(request, 'board/modify.html', data)

def modify(request):
    board_id = request.POST['id']
    board = Board.objects.get(id=board_id)
    board.title = request.POST['title']
    board.content = request.POST['content']
    board.save()
    data = {
        'board':board
    }
    return HttpResponseRedirect(board_id, data)

def delete(request, no=0):
    board = Board.objects.get(id=no)
    board.title = '삭제된 글입니다.'
    board.save()
    return HttpResponseRedirect('/board/list')

코드가 정리안되고 복잡한 느낌이 든다. .. . ..

코드를 다시 정리해야겠다.