Django 에서 날짜 처리 주의사항 과 사용자 정의 시간 형식 변환 에 대한 자세 한 설명
우 리 는 Django 로 models 를 만 들 때 시간 날짜 필드 의 처리 와 관련 된 경우 가 많 습 니 다.Django 에서 날짜 와 관련 된 Field 는 DateTimeField,DateField 와 TimeField 세 가지 유형 이 있 습 니 다.간단 해 보이 지만 실수 하기 쉬 운 부분 이 있 습 니 다.또한 Django 의 기본 시간 형식 에 익숙 하지 않 으 면 사용자 정의 로 수정 할 수도 있 습 니 다.
DateTimeField,DateField,TimeField 의 값 은 Python 의 datetime.datetime,datetime.date,datetime.time 세 개의 인 스 턴 스 에 대응 합 니 다.이 세 개의 Field 에는 두 개의 인자 가 있 습 니 다:autonow 와 autonow_add,기본 값 은 모두 False 입 니 다.
auto_now 매개 변수 설명:
대상 을 저장 할 때마다 필드 값 을 현재 시간 으로 자동 으로 설정 합 니 다.이 필드 를 저장 할 때 그 값 을 현재 시간 으로 설정 하고 model 을 수정 할 때마다 자동 으로 업 데 이 트 됩 니 다.따라서 이 매개 변 수 는'마지막 수정 시간'을 저장 해 야 하 는 장면 에서 매우 편리 하 며'last-modified'나'update'와 유사 합 니 다.time 필드.
주의해 야 할 것 은 이 필드 가 수 동 으로 수정 되 어 덮어 쓸 수 없다 는 것 이다.true 로 설정 되 었 을 때 Model.save()를 호출 할 때마다 현재 시간 으로 강제로 업 데 이 트 됩 니 다.다른 방식 으로 다른 필드 를 업데이트 할 때 업데이트 되 지 않 습 니 다.예 를 들 어 Query Set.update()방법 으로 이 필드 에 사용자 정의 값 을 지정 하 더 라 도 이 필드 는 변경 되 지 않 습 니 다.django 가 가 져 온 admin 관리 자 를 사용 하면 이 필드 는 admin 에서 만 읽 고 수정 할 수 없습니다.
예제 코드 는 다음 과 같다.
class Datacenter(models.Model):
id = models.UUIDField(' ID', default=uuid.uuid4, primary_key=True)
zone = models.ForeignKey(Zone, verbose_name=' ', on_delete=models.PROTECT)
dc_name = models.CharField(' ', max_length=128, unique=True)
networks = models.CharField('IP ', max_length=128, blank=True, unique=True)
update_time = models.DateTimeField(' ', auto_now=True)
def __str__(self):
return self.dc_name
class Meta:
verbose_name = ' '
verbose_name_plural = ' '
Datacenter 의 ModelAdmin 코드:
class DatacenterAdmin(admin.ModelAdmin):
list_display = ['id', 'dc_name', 'zone', 'networks', 'update_time']
search_fields = ['dc_name', 'zone', 'networks']
list_filter = ['dc_name', 'zone']
ordering = ['networks', 'zone']
admin.site.register(models.Datacenter, DatacenterAdmin)
Admin 인터페이스 효과 도:페이지 편집 을 누 르 면'업데이트 시간'편집 소 를 찾 을 수 없습니다.이 필드 는 읽 기만 하고 수 동 으로 수정 할 수 없 기 때 문 입 니 다.효과 도 는 다음 과 같 습 니 다.
페이지'save'이후 현재'업데이트 시간'을 살 펴 보면 시간 이 수정 되 었 습 니 다.
auto_now_add 매개 변수 설명:
True 로 설정 하면 model 대상 이 처음 만 들 어 졌 을 때 필드 의 값 을 만 들 때 시간 으로 설정 하고 나중에 대상 을 수정 할 때 필드 의 값 은 다시 업데이트 되 지 않 습 니 다.이 속성 은 보통'생 성 시간'을 저장 하 는 장면 에 사 용 됩 니 다.와 autonow 유사,autonow_add 도 강제 성 을 가지 고 있 습 니 다.True 로 설정 되면 프로그램 에서 필드 에 수 동 으로 값 을 부여 할 수 없고 admin 에서 필드 도 읽 기 전용 입 니 다.
아까 코드 예 시 를 계속 사용 하 세 요.'updatetime'의'autonow'고 쳐'autonow_add',기타 코드 는 변 하지 않 습 니 다:
class Datacenter(models.Model):
id = models.UUIDField(' ID', default=uuid.uuid4, primary_key=True)
zone = models.ForeignKey(Zone, verbose_name=' ', on_delete=models.PROTECT)
dc_name = models.CharField(' ', max_length=128, unique=True)
networks = models.CharField('IP ', max_length=128, blank=True, unique=True)
update_time = models.DateTimeField(' ', auto_now_add=True)
베 이 징 연합 기관실 의 IP 주 소 를 업데이트 한 후 저장 합 니 다.변경 후'업데이트 시간'은 변경 되 지 않 았 습 니 다.(아래 그림 참조)'auto'때 문 입 니 다.now_add'대상 생 성 완료 후 업데이트 하지 않 음:
어떻게 편집 가능 한 것 을 실현 합 니까?
auto_now 와 autonow_add 가 True 로 설정 되면 필드 가 editable=False 와 blank=True 의 상태 가 됩 니 다.editable=False 는 admin 에 필드 를 표시 하지 않 습 니 다.blank=Ture 는 폼 에 값 을 입력 하지 않 을 수 있 음 을 표시 합 니 다.이때 admin 의 fields 나 fieldset 에 이 날짜 시간 필드 를 강제로 추가 하면 프로그램 이 잘못 되 어 admin 이 열 수 없습니다.admin 에서 대상 을 수정 할 때 날짜 와 시간 을 보 려 면 날짜 시간 필드 를 admin 류 의 readonly 에 추가 할 수 있 습 니 다.fields 중:
readonly_fields = ('save_date', 'mod_date',)
그럼 문제 가 생 겼 습 니 다.실제 장면 에서 대상 의 생 성 시간 이 기본적으로 현재 값 으로 설정 되 기 를 원 할 뿐만 아니 라 나중에 수정 하 기 를 원 합 니 다.어떻게 이런 수 요 를 실현 합 니까?django 의 모든 model 필드 는 default 인 자 를 가지 고 있 으 며 필드 에 기본 값 을 설정 합 니 다.default=timezone.now 로 auto 를 대체 할 수 있 습 니 다.now=True 또는 autonow_add=True。timezone.now 는 django.utils.timezone.now()에 대응 하고 코드 예제:
from django.utils import timezone
class Datacenter(models.Model):
id = models.UUIDField(' ID', default=uuid.uuid4, primary_key=True)
zone = models.ForeignKey(Zone, verbose_name=' ', on_delete=models.PROTECT)
dc_name = models.CharField(' ', max_length=128, unique=True)
networks = models.CharField('IP ', max_length=128, blank=True, unique=True)
update_time = models.DateTimeField(' ', default=timezone.now())
def __str__(self):
return self.dc_name
class Meta:
verbose_name = ' '
verbose_name_plural = ' '
여기'updatetime'필드 의 기본 값 을 timezone.now()로 변경 한 후 다시 편집 하면 해당'업데이트 시간'필드 를 볼 수 있 고 수정 할 수 있 습 니 다.우 리 는 시간 일 수 를 하루 더 한 후에 종료 저장 하고'업데이트 시간'을 관찰 하 는 것 이 사용자 정의 시간 으로 바 뀌 었 습 니 다.
사용자 정의 날짜 형식:
방금 만 든 Django 응용 프로그램 입 니 다.보 이 는 날짜 표시 형식 이 다음 그림 과 유사 할 수 있 습 니 다(LANGUAGECODE 와 TIMEZONE 관련):
![ ](http://i2.51cto.com/images/blog/201803/23/164dc709843a56536c09c9142775a553.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
이 형식 에 익숙 하지 않 으 면 다음 과 같이 디 스 플레이 형식의 설정 을 정의 합 니 다.Django 의 setting.py 파일 을 변경 합 니 다.
USE_L10N = False
DATE_FORMAT = 'Y-m-d'
DATETIME_FORMAT = 'Y-m-d H:i:s'
주의사항:만약 USEL10N 을 True 로 설정 하면 언어 환경 에 규정된 형식 이 더 높 은 우선 순 위 를 가지 고 응용 된다.즉,DATEFORMAT 는 효력 이 발생 하지 않 습 니 다.여기 서 사용 할 수 있 는 포맷 문자열 의 다른 쓰기 방법 은 Django 공식 문 서 를 참조 하 십시오.
< https://docs.djangoproject.com/en/2.0/ref/templates/builtins/#date >;
또한 Django 페이지 가 렌 더 링 될 때 html 페이지 가 데이터베이스 에서 DateTimeField 필드 를 읽 을 때 표 시 된 시간 형식 과 데이터베이스 에 저 장 된 형식 이 일치 하지 않 습 니 다.다른 해결 방법 은 페이지 포맷 시간 에{Datacenter.updatetime|date:"Y-m-d H:i:s"}유사 한 필 터 를 추가 할 수 있 습 니 다.이후 페이지 를 새로 고치 면 정상적으로 표 시 됩 니 다.
관련 문서:
https://docs.djangoproject.com/en/2.0/ref/settings/
https://docs.djangoproject.com/en/2.0/ref/templates/builtins/#std:templatefilter-date
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django의 질문 및 답변 웹사이트환영 친구, 이것은 우리의 새로운 블로그입니다. 이 블로그에서는 , 과 같은 Question-n-Answer 웹사이트를 만들고 있습니다. 이 웹사이트는 회원가입 및 로그인이 가능합니다. 로그인 후 사용자는 사용자의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.