Django DateField 기본 옵션


82

날짜 시간 필드가있는 모델이 있습니다.

date = models.DateField(_("Date"), default=datetime.now())

내장 된 django 관리자에서 앱을 확인하면 DateField에 시간이 추가되어 저장하려고하면 오류가 반환됩니다. 기본값을 날짜로 만들려면 어떻게합니까? ( datetime.today()도 작동하지 않음)

답변:


150

그렇기 때문에 항상datetimeimport datetimedatetime 해당 모듈 내의 클래스가 아닌 기본 모듈 :을 가져와야합니다from datetime import datetime .

다른 실수는 실제로 기본값 인 (). 즉, 모든 모델은 클래스가 처음 정의 된 시간에 날짜 얻습니다. 따라서 서버가 Apache를 다시 시작하지 않고 며칠 또는 몇 주 동안 유지되면 모든 요소가 초기 날짜와 동일하게됩니다.

따라서 필드는 다음과 같아야합니다.

import datetime
date = models.DateField(_("Date"), default=datetime.date.today)

시간 델타를 추가하는 방법이 있습니까? 예를 들어 : default = datetime.date.today + datetime.timedelta (days = 4) ...이 코드는 작동하지 않지만 아이디어입니다. (허용됨, 저장 방법은이를 수행 할 수있는 한 곳이지만 정의의 일부로이를 수행하는 방법이 있는지 궁금합니다.)
Joe J

1
@Joe J : 이것은 정말로 새로운 질문이어야합니다. 그러나 callable을 사용할 수 있다는 사실은 today + 4를 반환하는 자체 함수를 정의 할 수 있다는 것을 의미합니다.
Daniel Roseman

23
어떻게되는 _("Date")거야?
benregn 2011-08-05

10
@benregn 필드에 "Date"라는 레이블을 부여하지만 국제화 시스템을 사용하여 번역을 위해 표시합니다.
Daniel Roseman 2011-08-05

명확히 해주셔서 감사합니다. 저는 방금 Django dev를 시작했고 그것이 단지 라벨링보다 더 많은 일을하고 있는지 조금 불분명했습니다.
benregn 2011-08-06

38

실수는 datetime모듈 대신 모듈을 사용하는 것입니다 date. 당신은 이것을하려고했습니다 :

from datetime import date
date = models.DateField(_("Date"), default=date.today)

현재 날짜 만 캡처하려는 경우이를 처리하는 적절한 방법은 auto_now_add매개 변수 를 사용하는 것입니다 .

date = models.DateField(_("Date"), auto_now_add=True)

그러나, modelfield 워드 프로세서 것을 명확 상태 auto_now_addauto_now됩니다 항상 현재 날짜를 사용하여 재정의 할 수있는 기본 값이 없습니다.


8
date = models.DateTimeField(default=datetime.now, blank=True)

5
DateTimeField는 동일하지 않습니다. DateField에 기본값으로 datetime을 제공하면 문제가 발생합니다.
onekiloparsec

6

이 문제를 해결하는 더 좋은 방법은 datetime callable을 사용하는 것입니다.

from datetime import datetime

date = models.DateField(default=datetime.now)

괄호가 사용되지 않았습니다. 괄호를 사용한 경우 now()함수를 한 번만 호출합니다 (모델이 생성 될 때). 대신 콜 러블을 인수로 전달하므로 모델의 인스턴스가 생성 될 때마다 호출됩니다.

Django Musings에 대한 크레딧 . 나는 그것을 사용했고 잘 작동합니다.


4

이것은 트릭을 수행해야합니다.

models.DateTimeField(_("Date"), auto_now_add = True)

1
내 친구 나는 당신이 그것을 잘못 읽은 것 같아요. 질문은 DateTimeField가 아니라 DateField에 관한 것입니다.
xxbinxx

2

당신은 또한 사용할 수 있습니다 lambda. django.utils.timezone.now를 사용하는 경우 유용합니다.

date = models.DateField(_("Date"), default=lambda: now().date())

6
문서를 보십시오 . : 기본 호출 가능 래퍼로 람다를 사용하는 것이 좋지 않다 Note that lambdas cannot be used for field options like default because they cannot be serialized by migrations. See that documentation for other caveats.
pulina

@pulina 맞습니다.하지만이 경우 구성된 시간대에 날짜를
바인딩해야하는

아니. 코드에서 실제 함수를 가리킬 수 있습니다. 모델 최상위 기능과 관련 하여 이에 따른 모든 기능 또는 방법 참조 .
pulina
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.