2013-02-12 39 views
5

जब मैं क्षेत्र पढ़ता हूं तो मैं django व्यवस्थापक पर फ़ील्ड पर अपना विजेट प्रदर्शित करना चाहता हूं।django व्यवस्थापक रीडोनली फ़ील्ड पर विजेट प्रदर्शित करने के लिए कैसे करें

admin.py

class AudioTrackAdminInline(admin.StackedInline): 
    model = AudioTrack 
    form = AudioTrackForm 
    readonly_fields = ('file',) 

forms.py

class AudioTrackForm(forms.ModelForm): 
    class Meta: 
     model = AudioTrack 
     widgets = { 'file': MediaFileInput, } # my widget 

जब फ़ाइल केवल पढ़ने के लिए नहीं है, यह विजेट ठीक प्रदर्शित करता है। लेकिन जब मैं इसे केवल पढ़ने के रूप में शामिल करता हूं, तो मुझे टेक्स्ट लाइन दिखाई देती है। (Django पढ़ने के लिए मेरे फॉर्म का उपयोग नहीं करता है)

मैं इसे केवल पढ़ने के क्षेत्र में भी फॉर्म का उपयोग करने के लिए कैसे प्राप्त कर सकता हूं?

या

कैसे एक और विजेट प्रदर्शित करने के लिए करता है, तो मैं अपने क्षेत्र केवल पढ़ने के लिए सेट?

उत्तर

4

मैं कहूंगा कि यह एक विशेषता है।

जब फ़ील्ड को पढ़ने के लिए सेट किया जाता है, तो Django display_for_field फ़ंक्शन का उपयोग करता है जो परिणाम को हार्डकोड करता है, आप इसे कस्टमाइज़ नहीं कर सकते हैं।

एक और तरीका क्षेत्र को पढ़ने और formfield_for_dbfield को ओवरराइड करने के लिए नहीं होगा, एक अनियंत्रित ModelAdmin विधि और आपकी आवश्यकताओं के अनुसार कार्य करें।

3

एक वैकल्पिक और अधिक लचीला समाधान अपने व्यवस्थापक वर्ग के get_form(...) विधि अधिभावी, उन क्षेत्रों आप केवल-पठन मोड में प्रस्तुत करना चाहते हैं "अक्षम" विशेषता निर्धारित करने में है:

def get_form(self, *args, **kwargs): 

    form = super(SupplierAdmin, self).get_form(*args, **kwargs) 

    for field_name in self.fake_readonly_fields: 
     form.base_fields[field_name].disabled = True 

    return form 

टिप्पणी है कि मैं हमेशा की तरह self.readonly_fields से नहीं लेकिन एक अलग सरणी है कि मैं self.fake_readonly_fields नामित से केवल पढ़ने के लिए फ़ील्ड का नाम लेना आदेश के नाम से बचने के लिए overlaps

प्रस्तावित समाधान की सीमा (formfield_for_dbfield का उपयोग) है कि है कि रास्ते में आप कम से प्रस्तुत करना वैसे ही एजी के सभी डेटाबेस फ़ील्ड iven प्रकार, गीला यह केवल पढ़ने या नहीं होना चाहिए। इस तरह काम करता है यदि आपका पूरा फॉर्म केवल पढ़ने के लिए ही होना चाहिए, लेकिन यदि आप उन फॉर्मों से संबंधित हैं जो आधा पढ़े गए हैं और आधा नहीं हैं, तो disabled विशेषता पर भरोसा करना बेहतर है। मेरा उत्तर यहाँ पर

अधिक जानकारी: django modeladmin, readonly_fields and boolean fields

+0

यह, '' disabled' Field' विशेषता का उपयोग के बाद से सभी विजेट एक 'django.contrib.gis.forms साथ (एचटीएमएल) विशेषता (जैसे समर्थन नहीं करना चाहिए। फ़ील्ड। पॉइंटफ़िल्ल्ड'), और इसे उपयोगकर्ता द्वारा बदला जा सकता है! तो 'form.base_fields [field_name] .disabled = True' का उपयोग किया जाना चाहिए। – blueyed