2010-01-08 29 views
60

Tôi có một mô hình trong đó có một lĩnh vực thời gian date:tùy chọn mặc định Django DateField

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

Khi tôi kiểm tra các ứng dụng trong xây dựng trong django admin, các DateField cũng có thời gian gắn vào nó, do đó nếu bạn cố gắng lưu nó, nó trả về một lỗi. Làm thế nào để tôi làm cho mặc định chỉ là ngày? (datetime.today() hiện không hoạt động)

Trả lời

107

Đây là lý do tại sao bạn nên luôn nhập cơ sở datetime mô-đun: import datetime, chứ không phải là lớp datetime trong module: from datetime import datetime.

Sai lầm khác bạn đã thực hiện là thực sự gọi hàm theo mặc định, với (). Điều này có nghĩa là tất cả các mô hình sẽ nhận được ngày tại thời điểm lớp học được xác định lần đầu tiên - vì vậy nếu máy chủ của bạn vẫn hoạt động trong nhiều ngày hoặc vài tuần mà không cần khởi động lại Apache, tất cả các thành phần sẽ nhận được ngày đầu tiên.

Vì vậy, lĩnh vực này nên là:

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

Có cách nào để thực hiện việc này thêm đồng bằng thời gian không? Ví dụ: default = datetime.date.today + datetime.timedelta (days = 4) ... mã này không hoạt động, nhưng đó là ý tưởng. (Cấp, phương pháp tiết kiệm là một nơi để làm điều này, nhưng chỉ cần tự hỏi nếu có một cách để làm điều này như là một phần của định nghĩa) –

+1

@ Joe J: đây phải là một câu hỏi mới thực sự. Nhưng thực tế là bạn có thể sử dụng một phương tiện có thể gọi, bạn chỉ có thể xác định chức năng của riêng bạn mà trả về ngày hôm nay + 4. –

+9

'_ (" Ngày ")' đang làm gì? – benregn

28

Bạn nhầm lẫn đang sử dụng mô-đun ngày giờ thay vì mô-đun ngày. Bạn có nghĩa là để làm điều này:

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

Nếu bạn chỉ muốn chụp ngày hiện tại một cách thích hợp để xử lý này là sử dụng các tham số auto_now_add:

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

Tuy nhiên, modelfield docs nêu rõ auto_now_add rằng và auto_now sẽ luôn luôn sử dụng ngày hiện tại và không phải là giá trị mặc định mà bạn có thể ghi đè.

3

này nên làm như lừa:

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

người bạn của tôi Tôi nghĩ bạn đọc sai. Câu hỏi là về DateField không phải về DateTimeField. – xxbinxx

6
date = models.DateTimeField(default=datetime.now, blank=True) 
+0

DateTimeField không giống nhau. Nếu bạn cung cấp một datetime như mặc định cho một DateField, bạn sẽ gặp rắc rối. – onekiloparsec

1

Bạn cũng có thể sử dụng lambda. Hữu ích nếu bạn đang sử dụng django.utils.timezone.now

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

Xem [tài liệu] (https://docs.djangoproject.com/en/1.7/ref/models/fields/#default). Không nên sử dụng lambda làm trình bao bọc có thể gọi được mặc định: 'Lưu ý rằng lambdas không thể được sử dụng cho các tùy chọn trường như mặc định vì chúng không thể được tuần tự hóa bằng cách di chuyển. Xem tài liệu đó cho caveats.' khác – pulina

Các vấn đề liên quan