django page 모델 설계

작성자: [관리자] 하얀설표

2025.12.09 23:12 (KST) 작성됨

2025.12.09 23:21 (KST) 수정됨






(12.09) 수정됨.

목적

단순 글 게시요. 댓글, 추천, 신고 등 기능 x

 

모델

페이지는 단순 내용 게시만을 위한 것이지만, 기초 골자는 게시글이다.

게시글과 게시글 내용을 별개로 보관한다.

게시글 수정시 수정전 내용을 보관할 수 있도록 하기 위함이다.

별도 보관을 안하는 경우, 게시글 내용을 덮어쓰면 된다.

 

공개시간 필드(published_at)를 별도로 만들어두면 예약발행을 설정할 수 있게 된다.

 

다수의 인원이 이용가능한 경우, blind 필드를 만들어 다른 사람의 게시물도 가릴 수 있도록 한다.

# 게시글 모델
class 게시글
pk
author: fk, user model # 작성자
slug: str # url을 수동 설정하는 경우
crwated_at: datetime # 최초 생성시간
published_at: datetime # 예약발행용, 기본값은 created_at
visibility: int|str # 공개 수준. 비공개, 공개, 멤버공개 등
password: str
tags: m2m # 태그
category: fk # 대분류 카테고리
blind: m2m

# 게시글 세부 모델
pk
article: fk
created_at: datetime # obj 생성시간과 다른면 수정시간으로 표시
title: str
content: str
text: str # content가 단순 텍스트가 아닌 html이나 markdown이면 내용 검색용 텍스트 보관

class 태그
name: str
slug: str

class 카테고리
name: str
slug: str
parent: fk, self # 하위카테고리 생성 목적

class blind
user: fk, user model
created_at: datetime
memo: str
is_blind: bool

 

동작

Create

객체 생성시 글 내용은 용량이 꽤 된다.

텍스트라 용량이 크진 않지만, invalid시 전달받은 내용을 다시 전달하는 것은 트래픽 낭비고, 이런 과정을 사전에 차단할 수 있기 때문에 가능하면 폼 제출 전 검증을 하도록 한다.

class createview
if not 로그인 => 403 perm err
if not has perm => 403 perm err

class 검증뷰
if valid => true
else => flase, 에레 메세지

 

Read

조회는 크게 어려울게 없다.

비밀번호 필드가 있는 경우, 비밀번호를 요청하도록 해야한다.

비밀번호 입력 페이지는 별도로 만들어도 되지만, 단순히 렌더링시 사용하는 템플릿을 변경하는 것으로 해결할 수 있다.

템플릿만 변경하는 경우 get과 post 통신으로 작업을 구분한다.

 

참고로 여기서 user permission을 확인해 멤버라도 권한에 따라 조회가 불가능하게 만들 수도 있다.

class readview
if method == get
  obj 가져오기
  if obj 비공개
    if not 관리자 or not 작성자 => 403 perm err
  elif obj 멤버공개
    if not 로그인 => 403 perm err
  if password
    if 관리자 or 작성자 => paas
    else => 301 비밀번호 입력 페이지 리다이렉트 or template 변경
content obj 가져오기
  tags obj 가져오기
  category obj 가져오기
  연결된 pv obj count
elif method == post
  if not obj.password => 400 bad request
  if password != obj.password => 401 auth err, 비밀번호 재요구
  else => get process 진행

 

list view

글 목록은 비공개를 제외한 글만 노출되도록 한다.

비공개 글은 관리자만 접근 가능한 페이지에서만 노출되도록 한다.

class listview
queryset 가져오기
queryset.filter(공개 또는 멤버공개)

class 관리자 listview
if not 관리자 => 403 perm err
queryset 가져오기

 

Update

수정 시에는 작성자인지 확인하는 과정이 있는걸 빼면 create와 거의 동일하게 진행된다.

게시글에 연결된 게시글 내용 obj 개수에 따라 수정 횟수를 제한하는 것도 가능하다.

class updateview
obj에 연결된 내용 obj 개수 세기
if 제한개수 and 제한개수 < 연결 개수 => 401 err, 수정회수 초과 알림 페이지 render
if obj.author != request.author => 403 perm err
if form valid
  if not 수전정 정보 보존하기 => 기존 obj 내용비우기
게시글과 연결된 신규 obj 생성

 

Blind

블라인드 기능은 다른 사람의 게시물을 가려버릴 때 사용한다.

언제, 누가, 왜, 블라인드 상태를 변경했는지를 기록한다.

class blindview
if not 관리자 => 403 perm err
if not memo => 블라인드 사유 재요청

 

Delete

삭제 기능은 실제로 db에서 삭제를 해도 되고, 아니면 비공개 상태로 돌리기만 해도 된다.

어느쪽이던 외부에는 삭제된 것과 동일하게 보이기 때문이다.

내용이 나중에 필요할 수도 있으므로 가능하면 공개 상태만 비공개로 돌리는걸 선호한다.

class deleteview
if not author and not 관리자 => 403 perm err
if 삭제하기 => obj와 연결된 모든 내용 obj 삭제
else => obj 상태를 비공개로 변경





추천 (0)


글 목록

댓글을 달 수 없는 게시물입니다.


"분류없음" 카테고리의 #Python, #Django 관련 게시물