Django-mysite만들기7 계층형 답글 게시판 기능 추가
23 Jun 2019 | django python django-ormdjango mini project
cafe24신입사원 교육과정 - django 수업 내용 정리
board app 추가 ! python manage.py startapp board
settings.py 에 app 추가
[1] 1(user):N(board) 관계 Model 정의
board/models.py
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가 지워지면 같이 삭제
계층형 게시판을 위해서,
groupno, orderno, depth 컬럼을 정의해 주었다.
groupno
컬럼 - 첫 게시글과, 그 게시글의 답글들에게 같은 groupno을 주어서 보여주기 위함
orderno
컬럼 - 같은 groupno의 게시글들을 최신순으로 위로 올리기 위함
depth
컬럼 - 답글들을 한 칸씩 밀려서 보이게 하기 위함
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')
코드가 정리안되고 복잡한 느낌이 든다. .. . ..
코드를 다시 정리해야겠다.