Django व्यवस्थापक: मॉडल में संपादन योग्य = गलत 'के रूप में चिह्नित फ़ील्ड को कैसे प्रदर्शित किया जाए?


99

हालांकि एक क्षेत्र 'editable=False'मॉडल के रूप में चिह्नित किया गया है, मैं इसे प्रदर्शित करने के लिए व्यवस्थापक पृष्ठ चाहूंगा। वर्तमान में यह पूरी तरह से क्षेत्र को छुपाता है .. इसे कैसे प्राप्त किया जा सकता है?

जवाबों:


195

Readonly फ़ील्ड्स का उपयोग करें । जैसे (django> = 1.2 के लिए):

class MyModelAdmin(admin.ModelAdmin):
    readonly_fields=('first',)

6
+1। खासतौर पर अगर आप एडमिन में फील्ड को एडिट करने की योजना नहीं बनाते।
मनोज गोविंदन

यह यहाँ काम नहीं करता है (Django 2.0)। फ़ील्ड तब व्यवस्थापक इंटरफ़ेस में प्रदर्शित नहीं होती है।
nerdoc

1
मैंने आपकी त्रुटि को पुन: उत्पन्न करने के लिए सिर्फ एक नमूना अनुप्रयोग बनाया (django 2.0.8, पायथन 3.5)। यह अभी भी ठीक काम करता है। शायद आपके ऐप @nerdoc में कुछ और गलत है?
tback

ओह। विशिष्ट तेज-गोली। परीक्षण नहीं किया, लगता है कि मेरी स्थापना में कोई समस्या है। धन्यवाद, और क्षमा करें।
nerdoc

2
मेरे लिए व्यवस्थापक तब क्रैश हो गया जब मैंने इसे जोड़ा fields, लेकिन जब मैंने इसे इसमें जोड़ा, तब readonly_fieldsतक नहीं दिखा जब तक मैंने इसे दोनों से नहीं जोड़ा और तब यह व्यवस्थापक में दिखाई दिया।
ओवेनफी

18

अपडेट करें

यह समाधान उपयोगी है यदि आप व्यवस्थापक में फ़ील्ड संपादन योग्य रखना चाहते हैं, लेकिन हर जगह गैर-संपादन योग्य है। आप क्षेत्र गैर संपादन योग्य रखना चाहते हैं भर तो @Till Backhaus ' जवाब बेहतर विकल्प है।

मूल उत्तर

ऐसा करने का एक तरीका ModelFormएडमिन में कस्टम का उपयोग करना होगा । यह फ़ॉर्म संपादन योग्य बनाने के लिए आवश्यक फ़ील्ड को ओवरराइड कर सकता है। जिससे आप editable=Falseहर जगह और प्रशासन को बनाए रखते हैं । उदाहरण के लिए (Django 1.2.3 के साथ परीक्षण)

# models.py
class FooModel(models.Model):
    first = models.CharField(max_length = 255, editable = False)
    second  = models.CharField(max_length = 255)

    def __unicode__(self):
        return "{0} {1}".format(self.first, self.second)

# admin.py
class CustomFooForm(forms.ModelForm):
    first = forms.CharField()

    class Meta:
        model = FooModel
        fields = ('second',)

class FooAdmin(admin.ModelAdmin):
    form = CustomFooForm

admin.site.register(FooModel, FooAdmin)

1
यह काम नहीं करता है, कम से कम django 1.6 पर प्रपत्र को व्यवस्थापक पैनल में सही ढंग से प्रदर्शित किया जाता है, लेकिन जब मैं किसी प्रपत्र को सहेजता हूं और फिर से उस पर वापस लौटता हूं, तो प्रपत्र मान फिर से डिफ़ॉल्ट होता है।
यूफोरबियम

4

आपकी रीड-ओनली फील्ड्स फील्ड्स में भी होनी चाहिए:

fields = ['title', 'author', 'content', 'published_date', 'updated_date', 'created_date']
readonly_fields = ('published_date', 'updated_date', 'created_date')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.