장고 블로그 앱: 모델 만들기 (확장)

소요 시간: 10분

블로그 앱을 구축할 때, 단순한 글 작성 기능만으로는 부족하다. 다양한 기능을 추가하여 블로그를 더 유용하게 만들기 위해서는 데이터 모델을 확장하는 것이 필요하다. 이번 글에서는 Django에서 모델을 확장하는 방법과 이를 활용한 기능 구현 방법을 소개한다.


1. 확장형 포스트 모델

기본적인 제목과 내용 외에도 게시글 작성자, 태그, 카테고리 등 다양한 정보를 저장하는 모델을 설계하는 것이다. 이를 통해 더 많은 기능을 제공하는 블로그 앱을 만들 수 있다.


2. 확장된 포스트 모델 정의

Django의 models.py에서 Article 모델을 확장한 예시 코드:

from django.db import models
from django.urls import reverse
from django.contrib.auth.models import User
from datetime import datetime, timedelta

class Post(models.Model):
    title = models.CharField(max_length=100)  # 제목
    slug = models.SlugField(unique=True, max_length=100)  # URL-friendly 문자열
    content = models.TextField()  # 게시글 내용
    author = models.ForeignKey(User, on_delete=models.CASCADE)  # 작성자
    category = models.CharField(max_length=50, blank=True, null=True)  # 카테고리
    tags = models.CharField(max_length=100, blank=True, null=True)  # 태그
    published_at = models.DateTimeField()  # 게시글 발행 일시
    updated_at = models.DateTimeField(auto_now=True)  # 마지막 수정 일시
    is_public = models.BooleanField(default=True)  # 공개 여부
    views = models.PositiveIntegerField(default=0)  # 조회수

    def __str__(self):
        return self.title


3. 필드 설명

Article 모델의 각 필드는 게시글의 다양한 속성을 저장하고, 블로그 애플리케이션의 기능성을 강화하는 중요한 역할을 한다. 각 필드가 무엇을 의미하는지, 그리고 어떻게 활용되는지 자세히 살펴보자.

title: 게시글 제목

title 필드는 게시글의 제목을 저장하는 문자열 필드이다. 이 필드는 블로그 글을 대표하는 중요한 요소이므로, 길이는 보통 100자 내외로 설정한다. 제목은 사용자가 게시글을 처음 볼 때 가장 중요한 정보이므로, 검색엔진 최적화(SEO) 측면에서도 중요하다.

title = models.CharField(max_length=100)

slug: URL에 사용되는 고유 문자열

slug 필드는 게시글의 고유한 URL을 생성하는 데 사용된다. 보통 게시글 제목을 기반으로 자동 생성되며, URL에서 사용될 수 있는 문자(영문, 숫자, 하이픈 등)로 이루어져 있다. slug는 URL에서 게시글을 식별하는 데 중요한 역할을 한다.

slug = models.SlugField(unique=True, max_length=100)

content: 게시글 내용

content 필드는 게시글의 본문 내용을 저장하는 텍스트 필드이다. 이 필드는 길이에 제한이 없기 때문에 긴 내용도 자유롭게 저장할 수 있다. 게시글의 핵심 내용이 저장되며, 글의 내용이 복잡할 경우 TextField를 사용하여 충분한 공간을 확보한다.

content = models.TextField()

author: 게시글 작성자

author 필드는 게시글을 작성한 사용자의 정보를 저장하는 필드로, Django의 기본 User 모델과 연결된다. 이를 통해 각 게시글에 대한 작성자 정보를 추적할 수 있으며, 작성자별 게시글을 관리하는 데 유용하다.

author = models.ForeignKey(User, on_delete=models.CASCADE)

category: 게시글 카테고리

category 필드는 게시글이 속하는 카테고리를 저장하는 필드로, 게시글을 주제별로 구분하는 데 유용하다. 이 필드는 선택 사항이며, 게시글이 어떤 카테고리에 속하는지 나타낼 수 있다. 예를 들어, "프로그래밍", "디자인", "AI"와 같은 카테고리를 설정할 수 있다.

category = models.CharField(max_length=50, blank=True, null=True)

tags: 게시글 태그

tags 필드는 게시글에 관련된 태그를 저장하는 필드로, 주로 글의 핵심 키워드나 주제를 나타낸다. 여러 개의 태그를 쉼표로 구분하여 입력할 수 있다. 태그는 게시글을 주제별로 분류하고, 특정 주제에 관심 있는 사용자들이 쉽게 관련 게시글을 찾을 수 있도록 돕는다.

tags = models.CharField(max_length=100, blank=True, null=True)

published_at: 게시글 발행일

published_at 필드는 게시글이 실제로 발행된 날짜와 시간을 저장한다. 이 필드는 게시글이 언제 작성되었는지, 발행되었는지에 대한 정보를 제공한다. 발행일을 기준으로 게시글을 최신순으로 정렬하거나, 특정 기간에 작성된 게시글을 필터링할 수 있다.

published_at = models.DateTimeField()

updated_at: 마지막 수정일

updated_at 필드는 게시글이 마지막으로 수정된 날짜와 시간을 자동으로 기록한다. 이 필드는 auto_now=True 속성을 사용하여, 게시글이 수정될 때마다 자동으로 갱신된다. 이를 통해 게시글의 최신 상태를 추적할 수 있다.

updated_at = models.DateTimeField(auto_now=True)

is_public: 공개 여부

is_public 필드는 게시글이 공개 상태인지 비공개 상태인지를 나타내는 불리언 필드이다. 기본값은 True로 설정되어 있으며, 이를 False로 변경하면 해당 게시글은 비공개로 처리된다. 관리자는 이 필드를 사용하여 게시글을 임시로 숨기거나, 비공개 상태로 유지할 수 있다.

is_public = models.BooleanField(default=True)

views: 게시글 조회수

views 필드는 게시글이 조회된 횟수를 기록하는 필드이다. 이 필드는 게시글의 인기도를 측정하거나, 인기 있는 게시글을 추천하는 데 유용하다. 기본값은 0으로 설정되며, 사용자가 게시글을 열 때마다 조회수가 증가한다.

views = models.PositiveIntegerField(default=0)

이처럼 Article 모델의 각 필드는 블로그의 다양한 기능을 구현하는 데 중요한 역할을 한다. 각 필드를 이해하고 적절하게 활용하면, 더 나은 블로그 앱을 만들 수 있다.


4. 사용자 정의 메서드

모델에 메서드를 추가하여 기능을 확장할 수 있다. 예를 들어, get_absolute_url, summary, is_recent 메서드를 활용하면 블로그의 편의성과 기능성을 높일 수 있다.

get_absolute_url

def get_absolute_url(self):
    """게시글의 절대 URL을 반환"""
    return reverse('article_detail', args=[str(self.slug)])

게시글의 상세 페이지 URL을 쉽게 생성할 수 있다.

summary

def summary(self):
    """게시글 내용을 요약"""
    return self.content[:100] + '...' if len(self.content) > 100 else self.content

게시글 내용을 요약하여 미리보기 형태로 제공할 수 있다.

is_recent

def is_recent(self):
    """게시글이 최근 7일 이내에 발행되었는지 확인"""
    return self.published_at >= datetime.now() - timedelta(days=7)

게시글이 최근 7일 이내에 발행되었는지 확인하는 메서드다. 최신 콘텐츠를 강조하거나 필터링할 때 유용하다.


5. 확장된 모델의 활용 예시

확장된 모델은 다양한 기능을 지원한다:


6. 결론

Article 모델의 확장은 블로그 앱의 기능을 강화하고 관리 효율성을 높인다. 확장형 모델을 통해 사용자의 요구에 맞춘 콘텐츠 제공, 인기 분석, 최신 글 강조 등의 다양한 기능을 지원할 수 있다. 이를 통해 더 많은 사용자 경험을 제공하고, 블로그의 품질을 한층 향상시킬 수 있다.

장고 리스트