2020-03-31

Django 16. 게시판 앱 모델 생성 / 연결

공지사항 게시판 앱인 notice app을 생성하고 models, admin, urls를 설정합니다.


1. 게시판 앱 생성

이 프로젝트의 게시판은 학사의 중요 공지사항을 알려주는 공지사항(notice app), 학과생들의 커뮤니티 활동을 위한 자유게시판(free app), 작성자가 표시되지 않는 타임라인 형식의 익명게시판(anonymous app) 총 3개의 앱으로 분류 되어있습니다. 공통적으로 구현한 기능과 각 앱에 추가된 기능은 다음과 같습니다.

  1. 게시판 공통 : 게시글CRUD, 텍스트에디터 적용, 파일업로드(한글명인코딩, 암호화저장), 검색
  2. 공지사항 : 중요게시글 상단고정, 글 작성 시 관리자 권한의 사용자로 제한
  3. 자유게시판 : 세부카테고리 분류(자유, 정보, 질문), 댓글달기, 답글달기
  4. 익명게시판 : Waypoint사용 무한스크롤, 게시글 추천하기, 댓글달기, 답글달기, FAB버튼

이후 포스팅부터 공지사항 앱과 구현방식이 비슷한 자유게시판 앱은 제외하고 공지사항, 익명게시판 앱의 개발기록을 포스팅하겠습니다.

공지사항 앱을 생성하기 위해 터미널에서 아래의 명령어로 notice 앱을 생성합니다.

1
$ django-admin startapp notice

settings.pyINSTALLED_APPS에 notice 앱을 추가해줍니다.

1
2
3
4
5
6
7
8
9
10
11
12
# cs_web/settings.py

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'users.apps.UsersConfig',
'notice.apps.NoticeConfig', # 추가 부분
]

*일반적으로 ‘notice’ 와 같이 app이름만 추가하셔도 상관은 없으나, django convention이며 시그널 또는 apps 파일에서 Config를 사용하는 경우가 있기에 저 형식으로 코드를 추가해줍니다.

2. urls.py 생성

app별로 urls를 관리하기 위해 notice 앱 내부에 urls.py를 생성한 후 아래와 같은 코드를 작성합니다.

1
2
3
4
5
6
7
8
# notice/urls.py

from django.urls import path
from . import views

app_name = 'notice'

urlpatterns = []

생성한 urls.py를 읽어올 수 있도록 settings.py가 있는 경로의 urls.py를 아래와 같이 수정합니다.

1
2
3
4
5
6
7
8
9
10
# cs_web/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
path('admin/', admin.site.urls),
path('users/', include('users.urls')),
path('notice/', include('notice.urls')),
]

3. models.py 작성

공지사항 앱의 DB 모델 필드는 다음과 같습니다.

필드 역할
writer 게시글 작성자
title 게시글 제목
content 게시글 내용
hits 게시글 조회수
top_fixed 중요 게시글 상단고정 여부
upload_images 텍스트에디터 사용시 이미지첨부 경로
upload_files 파일업로드
filename 업로드된 첨부파일 한글명 저장
registered_date 게시글 작성일

우선 파일과 관련된 필드들을 제외한 모델을 생성하기 위해 notice앱의 models.py에 아래와 같이 소스를 입력합니다. (파일과 관련된 필드들은 이후 파일업로드 구현 포스팅에서 역할과 추가를 자세하게 포스팅하겠습니다.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# notice/models.py

import os
from django.conf import settings
from django.db import models

class Notice(models.Model):
writer = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, verbose_name='작성자')
title = models.CharField(max_length=128, verbose_name='제목')
content = models.TextField(verbose_name='내용')
hits = models.PositiveIntegerField(verbose_name='조회수', default=0)
registered_date = models.DateTimeField(auto_now_add=True, verbose_name='등록시간')
top_fixed = models.BooleanField(verbose_name='상단고정', default=False)

def __str__(self):
return self.title

class Meta:
db_table = '공지사항'
verbose_name = '공지사항'
verbose_name_plural = '공지사항'

작성자인 writer 필드는 AUTH_USER_MODEL인 사용자 모델과 ForeignKey 관계로 연결되어 있으며 on_delete를 활용하여 사용자의 계정이 삭제되어도 작성자는 NULL로 변경, 게시글은 보존할 수 있도록 하였습니다. 조회수인 hits 필드는 PositiveIntegerField로 지정해 양수만 취급하도록 하고, 상단고정여부인 top_fixed 필드는 True값이면 게시글 리스트의 상단에 고정되도록 구현하기 위해 BooleanField로 지정합니다.

4. admin.py 작성

생성한 Model을 django admin페이지에서 관리할 수 있도록 admin.py에 아래의 코드를 추가합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# notice/admin.py

from django.contrib import admin
from .models import Notice

class NoticeAdmin(admin.ModelAdmin):
list_display = (
'title',
'writer',
'hits',
'registered_date',
)
search_fields = ('title', 'content', 'writer__user_id',)

admin.site.register(Notice, NoticeAdmin)

admin 커스텀 중 ForeignKey가 search_fields에 포함되어 있으면 incontains에러가 발생합니다. 작성자인 writer가 User모델과 ForeignKey 관계로 연결되어 있기 때문에 search_fields에 ‘writer__user_id’ 와 같은 형식으로 추가합니다.

5. DB Migrate

아래의 명령어로 migrations 파일을 생성한 후 django DB에 적용하기 위해 migrate를 진행합니다.

1
2
$ python manage.py makemigrations
$ python manage.py migrate

*app 생성 직후를 제외한 migrations는 명령 뒤에 app의 이름을 명시해주는것이 좋습니다.