(2024.06.30. 수정됨.)
사용 환경
OS : Windows 10
python : python 3.10.11
django : Djajgno 5.0.6
주요 파일 경로
blog
|- entry
| |- views.py
| |- models.py
|- templates/
| |- detail.html
|- manage.py
작성시간과 수정시간
글 작성과 수정을 구현했으니, 이번에는 글 작성시간과 글 수정시간을 추가해볼 겁니다.
모델 수정하기
models.py를 다음과 같이 수정해줍니다.
# entry/models.py
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=30,)
content = models.TextField(max_length=999, default='',)
date_post = models.DateTimeField(auto_now_add=True,) # 추가
date_edit = models.DateTimeField(auto_now=True,) # 추가
auto_now_add
object가 최초로 생성되었을 때의 시간을 가져오는 옵션입니다.
auto_now
object가 수정될 때마다 시간을 저장하는 옵션입니다.
템플릿 수정하기
템플릿에 {{ object.date_post }}와 {{ object.date_edit }}를 추가해 작성시간과 수정시간을 확인할 수 있도록 합니다.
<head></head>
<body>
{% if request.user.is_anonymous %}
<div>
<a href="/admin/login/?next={{ request.get_full_path }}">로그인하기</a>
</div>
{% else %}
<p>"{{ request.user.username }}"님</p>
<form action="/admin/logout/?next={{ request.get_full_path }}" method="post">
{% csrf_token %}
<input type="submit" value="로그아웃">
</form>
{% endif %}
<br>
<h1>{{ object.title }}</h1>
<a href="/entry/{{ object.pk }}/edit/">글 수정하기</a>
<a href="/entry/{{ object.pk }}/delete/">글 삭제하기</a>
<article>
<div>작성 시간 : {{ object.date_post }}</div>
<div>수정 시간 : {{ object.date_edit }}</div>
<div>
{{ object.content|safe }}
</div>
</article>
</body>
마이그레이트
모델의 내용이 변경되었으니 마이그레이션을 만들고 마이그레이트합니다.
(python3.10) C:\seolpyo\python3.10\Django\blog>python manage.py makemigrations
(python3.10) C:\seolpyo\python3.10\Django\blog>python manage.py migrate
It is impossible to add the field 'date_post' with 'auto_now_add=True'
만약 db에 저장된 Post object가 존재한다면, 다음과 같이 새로 추가한 필드의 기본값을 지정해달라는 메세지가 노출될 수 있습니다.
(python3.10) C:\seolpyo\python3.10\Django\blog>python manage.py makemigrations
It is impossible to add the field 'date_post' with 'auto_now_add=True' to post without providing a default. This is because the database needs something to populate existing rows.
1) Provide a one-off default now which will be set on all existing rows
2) Quit and manually define a default value in models.py.
Select an option:
1을 입력해 기본값을 제공해주는 것을 선택합니다.
그 다음 "timezone.now"를 입력하고 엔터 키를 입력하면 문제없이 makemigrations 작업이 이루어집니다.
(python3.10) C:\seolpyo\python3.10\Django\blog>python manage.py makemigrations
It is impossible to add the field 'date_post' with 'auto_now_add=True' to post without providing a default. This is because the database needs something to populate existing rows.
1) Provide a one-off default now which will be set on all existing rows
2) Quit and manually define a default value in models.py.
Select an option: 1
Please enter the default value as valid Python.
Accept the default 'timezone.now' by pressing 'Enter' or provide another value.
The datetime and django.utils.timezone modules are available, so it is possible to provide e.g. timezone.now as a value.
Type 'exit' to exit this prompt
[default: timezone.now] >>> timezone.now
Migrations for 'entry':
entry\migrations\0002_post_date_edit_post_date_post.py
- Add field date_edit to post
- Add field date_post to post
확인해보기
개별 글을 확인해보면 작성 시간과 수정 시간이 표시됩니다.

수정해보기
글을 수정하면 작성 시간은 그대로 유지되고, 수정시간만 변경되는 것을 확인할 수 있습니다.

시간을 직접 수정하고 싶다면??
현재 설정은 시간값이 자동으로 입력되도록 되어있기 때문에 시간을 임의로 지정할 수 없습니다.
만약 작성시간이나 수정시간을 임의로 수정하고 싶다면 DateTimeField의 arg를 공란으로 두거나, auto_now와 auto_now_add를 False로 선언하면 됩니다.
auto_now나 auto_now_add를 변경한 경우에는 따로 마이그레이트를 하지 않아도 됩니다.
# entry/models.py
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=30,)
content = models.TextField(max_length=999, default='',)
# date_post = models.DateTimeField(auto_now_add=True,)
date_post = models.DateTimeField() # 변경
# date_edit = models.DateTimeField(auto_now=True,)
date_edit = models.DateTimeField(auto_now=False, auto_now_add=False,) # 변경
확인해보기
DateTimeField의 값이 자동으로 추가되지 않는다면 다음과 같이 따로 입력을 요구하게 됩니다.

이 글의 댓글 기능은 일부러 막아놓았습니다. 궁금한 내용이 있다면 게시판을 이용해주세요!