2010-08-07 15 views
85

ऑब्जेक्ट के लिए स्वचालित रूप से निर्माण दिनांक सेट करने का सबसे अच्छा तरीका क्या है, और यह भी फ़ील्ड जो ऑब्जेक्ट को आखिरी बार अपडेट किया गया था रिकॉर्ड करेगा?django मॉडल फॉर्म ऑब्जेक्ट्स के लिए स्वचालित निर्माण दिनांक?

अपने मॉडल में मेरे पास है:

created_at = models.DateTimeField(False, True, editable=False) 
updated_at = models.DateTimeField(True, True, editable=False) 

और मेरे विचार में:

objects_object.created_at may not be NULL 

मैं मैन्युअल रूप से यह मान अपने आप को स्थापित करने के लिए है:

if request.method == 'POST': 
    form = MyForm(request.POST) 
    if form.is_valid(): 
     obj = form.save(commit=False) 
     obj.user = request.user 
     obj.save() 
     return HttpResponseRedirect('obj_list') 

मैं त्रुटि मिलती है ? मैंने सोचा था कि डेटटाइमफ़िल्ड्स को पारित पैरामीटर का बिंदु था (या वे सिर्फ डिफ़ॉल्ट हैं, और चूंकि मैंने 'संपादन योग्य = गलत' सेट किया है, इसलिए वे फॉर्म पर प्रदर्शित नहीं होते हैं, इसलिए अनुरोध में सबमिट न करें , और इसलिए फार्म में नहीं डालते हैं?)।

ऐसा करने का सबसे अच्छा तरीका क्या है? एक init विधि?

धन्यवाद

ps - मैं एक Django और पायथन नौसिखिया ...

उत्तर

184

आप क्रमश: updated_at और created_at के लिए auto_now और auto_now_add विकल्पों का उपयोग कर सकते हैं।

class MyModel(models.Model): 
    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 
+14

'auto_now' और 'auto_now_add' को बुरा माना जाता है, इसलिए उनसे बचने का प्रयास करें। [यह उत्तर] (http://stackoverflow.com/a/1737078/1226722) बताता है कि 'save()' विधि को ओवरराइड करने के लिए बेहतर दृष्टिकोण क्यों प्रदान करता है और प्रदान करता है। – gregoltsov

+2

यह इस त्रुटि का उत्पादन करता है: 'आप बिना किसी डिफ़ॉल्ट के गेमसर को गैर-शून्य फ़ील्ड' create_at 'जोड़ने का प्रयास कर रहे हैं; हम ऐसा नहीं कर सकते (डेटाबेस को मौजूदा पंक्तियों को पॉप्युलेट करने के लिए कुछ चाहिए)। कृपया एक फिक्स का चयन करें: 1) अब एक-ऑफ डिफॉल्ट प्रदान करें (सभी मौजूदा पंक्तियों पर सेट किया जाएगा) 2) छोड़ें, और मुझे मॉडल.py में एक डिफ़ॉल्ट जोड़ें, एक विकल्प का चयन करें: 1 कृपया दर्ज करें डिफ़ॉल्ट मान अब, वैध पायथन के रूप में डेटाटाइम और django.utils.timezone मॉड्यूल उपलब्ध हैं, तो आप उदाहरण के लिए कर सकते हैं timezone.now() >>> timezone.now() ' –

+0

डेटाबेस पर पंक्तियों को हटाएं, या विकल्प 1 जांचें और टाइमज़ोन जोड़ें .now() – mullerivan

संबंधित मुद्दे