DateTimeField व्यवस्थापक प्रणाली में प्रदर्शित नहीं होता है


90

मेरा "दिनांक" फ़ील्ड व्यवस्थापन प्रणाली में कैसे नहीं आता है?

मेरे व्यवस्थापक फ़ाइल में मेरे पास है

from django.contrib import admin
from glasses.players.models import *
admin.site.register(Rating)

और रेटिंग मॉडल में "दिनांक" नामक एक फ़ील्ड है जो इस तरह दिखता है

date = models.DateTimeField(editable=True, auto_now_add=True)

हालाँकि, व्यवस्थापन प्रणाली में, फ़ील्ड दिखाई नहीं देता, भले ही editableवह सेट हो True

क्या किसी को कोई ख़याल है?

जवाबों:


59

मेरा मानना ​​है कि auto_now_addक्षेत्र के साथ झूठ का कारण है ।

से इस उत्तर :

Auto_now विशेषता सेट के साथ कोई भी क्षेत्र संपादन योग्य = गलत भी होगा और इसलिए व्यवस्थापक पैनल में दिखाई नहीं देगा।

डॉक्स में भी उल्लेख किया गया है :

जैसा कि वर्तमान में लागू किया गया है, Auto_now या Auto_now_add को True पर सेट करने से फ़ील्ड संपादन योग्य = गलत और रिक्त या ट्रू सेट हो जाएगा।

इसका कोई मतलब नहीं है, क्योंकि क्षेत्र के संपादन योग्य होने का कोई कारण नहीं है अगर यह ऑब्जेक्ट को सहेजे जाने पर वर्तमान डेटाटाइम के साथ अधिलेखित होने वाला है।


31
हालांकि निश्चित रूप से आपको प्रविष्टि पहली बार बनाए जाने के बादauto_now_add व्यवस्थापक के माध्यम से संपादित करने में सक्षम होना चाहिए ?
क्रिस्टोफर ओरल

70
आपको इसे केवल व्यवस्थापक इंटरफ़ेस में प्रदर्शित करने में सक्षम होना चाहिए , भले ही वह अप्रभावी हो।
ब्रैड

1
कृपया इसका उत्तर नीचे दिए गए @hunger द्वारा व्यवस्थापक इंटरफ़ेस में आसानी से फ़ील्ड के रूप में प्रदर्शित करने के लिए देखें।
ग्‍वाल

1
फ़ील्ड संपादन योग्य होने का कोई मतलब नहीं है यदि फ़ील्ड केवल एक ऑब्जेक्ट निर्माण (in_now_add = True) पर इनवेट है।
सर्गच

210

यदि आप वास्तव में व्यवस्थापक पैनल में तारीख देखना चाहते हैं, तो आप admin.pyreadonly_fields में जोड़ सकते हैं :

class RatingAdmin(admin.ModelAdmin):
    readonly_fields = ('date',)

admin.site.register(Rating,RatingAdmin)

आपके द्वारा निर्दिष्ट कोई भी फ़ील्ड संपादन योग्य फ़ील्ड के बाद अंतिम रूप से जोड़ दिया जाएगा। आदेश को नियंत्रित करने के लिए आप fieldsविकल्पों का उपयोग कर सकते हैं ।

अतिरिक्त जानकारी Django डॉक्स से उपलब्ध है ।


33
यह असली जवाब है !!
ग्रीनएजेड

4
यदि आप निर्धारित fieldsकरते हैं तो आपको अपना क्षेत्र भी उसी में रखना होगा, इसलिए आपको इसकी आवश्यकता होगी readonly_fieldsऔर fieldsअन्यथा यह क्षेत्र दिखाई नहीं देगा।
ब्योर्न

मैं केवल यह नोट करना चाहता था कि यह भी लागू होता है यदि आप उपयोग कर रहे हैं fieldsets, तो बस आज इस मुद्दे में भाग गया।
केविन ब्राउन

1
यह फ़ील्ड केवल तभी दिखाई देगी जब हम क्लिक करते हैं और किसी विशेष प्रविष्टि को खोलते हैं। यदि आप चाहते हैं कि फ़ील्ड सूची में दिखाई दे, तो stackoverflow.com/a/34966908/4440874
ज्योतिमान सिंह

1
ध्यान दें कि मुझे यकीन नहीं है कि क्यों लेकिन यह auto_now_add=TrueDjango 1.9 के तहत DateTimeFields के लिए काम नहीं करता है । ए (क्रमबद्ध) वर्कअराउंड उन्हें list_displayटपल के बजाय जोड़ना है । संपादित करें: यह काम करेगा यदि आप अपने क्षेत्र को fields@BjornTipling के रूप में भी जोड़ते हैं ।
टेलर एड्मिस्टन

23

प्रमुख हैक:

यदि आपको वास्तव में ऐसा करने की आवश्यकता है (जैसा कि मैं करता हूं) तो आप हमेशा इसके चारों ओर हैक कर सकते हैं तुरंत इस क्षेत्र को "संपादन योग्य" बनाकर क्षेत्र को इस प्रकार परिभाषित कर सकते हैं:

class Point(models.Model):
  mystamp=models.DateTimeField("When Created",auto_now_add=True)
  mystamp.editable=True

यह फ़ील्ड को संपादन योग्य बना देगा, जिससे आप वास्तव में इसे बदल सकते हैं। यह ठीक काम करने लगता है, कम से कम mysql बैकिंग इंजन के साथ। मैं सर्टिफिकेट के लिए यह नहीं कह सकता कि यदि अन्य बैकिंग स्टोर डेटाबेस में इस डेटा को अपरिवर्तनीय बना देते हैं और इस प्रकार संपादन का प्रयास करने पर समस्या होती है, इसलिए सावधानी के साथ उपयोग करें


नहीं, यह मत करो, भूख द्वारा वर्णित readonly_fields समाधान का उपयोग करें।
ग्रीनएजजेड

2
@GreenAsJade: एक तर्क अच्छा होगा।
मुहस्तिथ

@स्मिथिथ राशनले ने इसके बजाय हंगर के समाधान का उपयोग करने के लिए: क्योंकि यह एक प्रमुख हैक है और "सावधानी के साथ उपयोग" के साथ आता है, व्हेयर हंगर का समाधान django का उपयोग करता है जिस तरह से इसका उपयोग करने के लिए डिज़ाइन किया गया है। जब आप एक वैध और समर्थित फैशन में क्या कर सकते हैं तो आप एक बड़ी हैक का जोखिम क्यों उठा सकते हैं?
ग्रीनएजजैड

6
यह हैक समाधान उतना बुरा नहीं है। हालांकि मैं देख रहा हूँ इसके लिए केवल उपयोग का मामला है - जब परीक्षक को तारीख बदलने की आवश्यकता होती है।
जकूर

2
बस एक चेतावनी: इस हैक ने मेरे लिए पलायन को गड़बड़ कर दिया
डेमियो

16

आपकी विशिष्ट आवश्यकताओं, और व्यवहार में अंतर की किसी भी बारीकियों के आधार पर, आप निम्नलिखित कार्य कर सकते हैं:

from django.utils.timezone import now

class MyModel(models.Model):
    date = models.DateTimeField(default=now)

डिफ़ॉल्ट फ़ील्ड का उपयोग इस तरह किया जा सकता है: https://docs.djangoproject.com/en/dev/ref/models/fields/#default

The default value for the field. This can be a value or a callable object. If callable it will be called every time a new object is created.

यह करने के लिए संपादन योग्य नहीं है False


1
मैं from django.utils.timezone import nowइसके बजाय प्रयोग करेंगे datetime.now, लेकिन यह आशाजनक है।
amjoconn

धन्यवाद, मैंने इसे बदल दिया।
orblivion

Stackoverflow बहुत बढ़िया है क्योंकि, कुछ जवाब आपको एहसास कराते हैं कि आपने सही सवाल नहीं पूछा! धन्यवाद।
सैमुअल Dauzon

5

इसे auto_now_add सच होने के साथ करना पड़ सकता है। शायद जोड़ने पर तारीख को पकड़ने के लिए उस पैरामीटर के बजाय, आप आईडी शून्य होने पर डेटाइम को सम्मिलित करने के लिए मॉडल सहेजें विधि को ओवरराइड कर सकते हैं।

class Rating(models.Model):

    ....
    def save(self, *args, **kwargs)
        if not self.id: 
            self.date = datetime.datetime.now()

यदि आपने किया, तो फ़ील्ड को auto_now के
FallenAngel

निश्चित नहीं है कि नीचे की ओर क्यों; पहला लिंक शॉन चिन प्रदान करता है एक समान दृष्टिकोण इंगित करता है।
जो जे

यह एक समझदार विकल्प है, यह मानते हुए auto_nowउपयोग नहीं किया जाता है और editable=False। +1
शॉन चिन

3

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

class RatingAdmin(admin.ModelAdmin):
    list_display = ('name', 'date') 

admin.site.register(Rating, RatingAdmin)

'नाम' आपका मुख्य क्षेत्र या कोई अन्य क्षेत्र है जिसे आप व्यवस्थापक पैनल में प्रदर्शित करना चाहते हैं।

इस तरह आप उन सभी कॉलमों को निर्दिष्ट कर सकते हैं जिन्हें आप देखना चाहते हैं।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.