Django DateField डिफ़ॉल्ट विकल्प


82

मेरे पास एक मॉडल है जिसमें दिनांक समय क्षेत्र है:

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

जब मैं django व्यवस्थापक में अंतर्निहित एप्लिकेशन की जांच करता हूं, तो DateFieldउसके पास समय भी जोड़ा जाता है, ताकि यदि आप इसे सहेजने का प्रयास करते हैं तो एक त्रुटि वापस आ जाती है। मैं केवल दिनांक को डिफ़ॉल्ट कैसे बनाऊं? ( datetime.today()या तो काम नहीं कर रहा है)

जवाबों:


150

यही कारण है कि आपको हमेशा आधार datetimeमॉड्यूल आयातimport datetime करना चाहिए :datetime उस मॉड्यूल के वर्ग के बजाय from datetime import datetime

आपके द्वारा की गई दूसरी गलती वास्तव में फ़ंक्शन को डिफ़ॉल्ट रूप से कॉल करना है, के साथ ()। इसका मतलब है कि सभी मॉडलों को उस समय की तारीख मिल जाएगी जब कक्षा पहली बार परिभाषित की गई है - इसलिए यदि आपका सर्वर अपाचे को फिर से शुरू किए बिना दिनों या हफ्तों तक रहता है, तो सभी तत्वों को एक ही प्रारंभिक तिथि मिल जाएगी।

तो क्षेत्र होना चाहिए:

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

क्या इसमें एक समय डेल्टा जोड़ने का एक तरीका है? उदाहरण के लिए: डिफ़ॉल्ट = datetime.date.today + datetime.timedelta (दिन = 4) ... यह कोड काम नहीं करता है, लेकिन यह विचार है। (दी गई, बचाने की विधि ऐसा करने के लिए एक जगह है, लेकिन सिर्फ यह सोचकर कि क्या परिभाषा के हिस्से के रूप में ऐसा करने का कोई तरीका है)
जो जे

1
@ जो जे: यह वास्तव में एक नया प्रश्न होना चाहिए। लेकिन तथ्य यह है कि आप एक कॉल करने योग्य साधन का उपयोग कर सकते हैं आप बस अपने स्वयं के फ़ंक्शन को परिभाषित कर सकते हैं जो आज + 4 रिटर्न करता है।
डैनियल रोजमैन

23
क्या _("Date")कर रहा है?
१०:५० बजे बेंरगेन

10
@benregn यह क्षेत्र को "तिथि" का एक लेबल दे रहा है, लेकिन अंतर्राष्ट्रीयकरण प्रणाली का उपयोग करके इसे अनुवाद के लिए चिह्नित कर रहा है।
डेनियल रोसमैन

यह स्पष्ट करने के लिए धन्यवाद कि, मैंने अभी-अभी Django देव की शुरुआत की है और यह मेरे लिए थोड़ा अस्पष्ट था कि अगर यह और अधिक कर रहा था तो बस लेबलिंग।
बेन्तेर्ग

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 समान नहीं है। यदि आप डेटफिल्ड को डिफ़ॉल्ट के रूप में एक डेटाइम प्रदान करते हैं, तो आपको परेशानी होगी।
वनकिलोपार्सेक

6

मुझे लगता है कि इसे हल करने का एक बेहतर तरीका डेटाटाइम कॉल करने योग्य होगा:

from datetime import datetime

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

ध्यान दें कि कोई कोष्ठक का उपयोग नहीं किया गया था। यदि आपने कोष्ठक का उपयोग किया है तो आप now()केवल एक बार (जब मॉडल बनाया जाता है) फ़ंक्शन को लागू करेंगे । इसके बजाय, आप एक तर्क के रूप में कॉल करने योग्य पास करते हैं, इस प्रकार हर बार मॉडल का एक उदाहरण बनाया जाता है।

Django Musings के लिए क्रेडिट । मैंने इसका उपयोग किया है और ठीक काम करता है।


4

यह काम कर जाना चाहिए:

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

1
मेरे दोस्त मुझे लगता है कि आप इसे गलत पढ़ते हैं। DateField के बारे में प्रश्न DateTimeField के बारे में नहीं है।
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.
पुलिना

@ पुलीना आप सही कह रहे हैं, लेकिन इस मामले में जब आपको कॉन्फ़िगर किए गए
टाइमज़ोन

नहीं। आप कोड में एक वास्तविक फ़ंक्शन को इंगित कर सकते हैं। किसी भी फ़ंक्शन या पद्धति का संदर्भ इस संबंध में है कि मॉडल शीर्ष स्तर फ़ंक्शन है।
पुलिना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.