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_add및 auto_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.