2020-05-09

Django 28. 게시글 / 댓글 작성일 표시 형식 변경

게시글과 댓글 작성일을 property를 사용해 몇 분전, 몇 일전과 같은 형식으로 표시되게 구현합니다.


1. 표시형식 변경 함수 작성

Date형식으로 표시되는 작성일 필드인 registerd_date를 작성일을 기준으로 몇 분 전, 몇 시간 전, 몇 일 전인지 표시하기 위해 models.py에 아래와 같이 create_string 함수를 추가합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# free/models.py

from datetime import datetime, timedelta

class Free(models.Model):
@property
def created_string(self):
time = datetime.now(tz=timezone.utc) - self.registered_date

if time < timedelta(minutes=1):
return '방금 전'
elif time < timedelta(hours=1):
return str(int(time.seconds / 60)) + '분 전'
elif time < timedelta(days=1):
return str(int(time.seconds / 3600)) + '시간 전'
elif time < timedelta(days=7):
time = datetime.now(tz=timezone.utc).date() - self.registered_date.date()
return str(time.days) + '일 전'
else:
return False

class Comment(models.Model):
@property
def created_string(self):
time = datetime.now(tz=timezone.utc) - self.created

if time < timedelta(minutes=1):
return '방금 전'
elif time < timedelta(hours=1):
return str(int(time.seconds / 60)) + '분 전'
elif time < timedelta(days=1):
return str(int(time.seconds / 3600)) + '시간 전'
elif time < timedelta(days=7):
time = datetime.now(tz=timezone.utc).date() - self.created.date()
return str(time.days) + '일 전'
else:
return False

게시판 모델인 Free 클래스와 게시판의 댓글 모델인 Comment 클래스 내부에 추가한 created_string 함수는 파이썬의 Decorator인 property를 사용하여 함수가 아닌 멤버변수와 같은 형식으로 접근 할 수 있게 합니다. @property를 사용함으로써 외부에서 클래스 내부 변수를 참조 할 수 있게 됩니다.

created_string 함수를 살펴보면 time 변수에 현재시간에서 작성시간을 뺀 작성경과 시간을 저장합니다. 그 후 timedelta 메소드를 사용하여 분, 시간, 일 단위로 표시되게 하며 7일이 지날 경우 false를 반환하여 템플릿에서 원래의 Date형식으로 표시되게 구현합니다.

2. 게시글 작성일 표시 templates 변경

게시글 리스트에서 작성일의 표시형식을 변경하기 위해 free_list.html의 작성일 표시 부분인 free.registered_date를 아래와 같이 변경합니다. property를 사용했기에 free.created_string과 같은 형식으로 함수를 호출 할 수 있게 됩니다.

1
2
3
4
5
6
7
<!-- templates/free/free_list.html -->

{% if free.created_string == False %}
<td>{{ free.registered_date|date:'m월 d일' }}</td>
{% else %}
<td>{{ free.created_string }}</td>
{% endif %}

3. 댓글 작성일 표시 templates 변경

게시글 리스트와 마찬가지로 특정 게시글의 댓글의 표시형식도 변경하기 위해 free_detail.html의 댓글 작성일 표시 부분을 아래와 같이 수정합니다.

1
2
3
4
5
6
7
<!-- templates/free/free_detail.html -->

{% if comment.created_string == False %}
<span style="float:right;">{{ comment.created|date:'m월 d일' }}</span>
{% else %}
<span style="float:right;">{{ comment.created_string }}</span>
{% endif %}

4. 결과

django-project-28

django-project-28

*전체 html, css 등은 자세하게 포스팅하지 않습니다. 제 Github에서 소스를 확인하실 수 있습니다.