2011-02-23 5 views
5

मैं कुछ केवल पढ़ने के क्षेत्रों के साथ Django व्यवस्थापक साइट का उपयोग कर रहा हूँ रिकॉर्ड पर:Django व्यवस्थापक: नए रिकॉर्ड पर केवल पढ़ने के लिए फ़ील्ड छुपाएं?

class BookAdmin(admin.ModelAdmin): 
    fieldsets = [ 
    (None, {'fields': ['title', 'library_id', 'is_missing', \ 
         'transactions_all_time']}), 
    ] 
    readonly_fields = ['transactions_all_time',] 
    list_display = ('library_id', 'author', 'title') 

यह महान काम करता है जब रिकॉर्ड संपादन - transactions_all_time क्षेत्र केवल पढ़ने के लिए है, बस के रूप में मैं चाहता हूँ।

हालांकि, नए रिकॉर्ड जोड़ते समय यह थोड़ा विचित्र व्यवहार करता है। मुझे पृष्ठ के निचले भाग में केवल पढ़ने वाला अनुभाग मिलता है, जिसे मैं संपादित नहीं कर सकता और जो इस बिंदु पर अप्रासंगिक है।

यह बेहतर होगा अगर यह फ़ील्ड नए रिकॉर्ड जोड़ने पर बिल्कुल मौजूद न हो।

कोई नया रिकॉर्ड जोड़ने के दौरान केवल पढ़ने वाले फ़ील्ड प्रदर्शित करने के लिए कोई Django विकल्प नहीं है? मुझे पता है कि मैं इसे छिपाने के लिए add_form.html पर सीएसएस को हैक कर सकता हूं, लेकिन क्या कोई बेहतर तरीका है?

धन्यवाद।

उत्तर

0

एक और विकल्प यह है कि आप मूल मॉडल में editable तर्क सेट करते हैं।

class Book(models.Model): 
    transactions_all_time = models.BooleanField(editable=False) 

आपका मॉडलएडमिन संस्करण में फ़ील्ड नहीं दिखाएगा, फ़ील्ड को बाहर कर दिया जाएगा।

+0

वह चाहता है कि फ़ील्ड केवल संपादन फ़ॉर्म पर ही पढ़ा जाए, इसे पूरी तरह से बाहर न करें। –

+0

यह एक दृश्य दृश्य है जिसे मैं ध्यान में रखता हूं, संपादन योग्य दृश्य नहीं। – AP257

13

मुझे भी इसी तरह की समस्या थी। इसे

class MyModelAdmin(admin.ModelAdmin): 
    readonly_fields = ('field_one',) 
    def get_readonly_fields(self, request, obj=None): 
     if obj: # Editing 
      return self.readonly_fields 
     return() 
1

मुझे थोड़ा अलग समाधान के साथ एक ही समस्या थी।

class PhotoAdmin(admin.ModelAdmin): 
readonly_fields = ('admin_image', 'admin_thumb',) 
search_fields = ('filename', 'user', 'supplier', 'customer') 
list_display= ('admin_thumb','filename', 'user', 'supplier', 'customer') 
#fields = ('admin_thumb', 'admin_image', 'original_image', 'user', 'supplier', 'customer') 


def get_fieldsets(self, request, obj=None): 
    fieldset_existing = (
     (None, { 
      'classes': ('wide',), 
      'fields': ('admin_thumb', 'admin_image', 
       'original_image', 'user', 'supplier', 'customer', 'priority',)} 
     ), 
    ) 
    fieldset_new = (
     (None, { 
      'classes': ('wide',), 
      'fields': ('original_image', 'user', 'supplier', 'customer', 'priority',)} 
     ), 
    ) 
    if obj: # Editing 
     return fieldset_existing 
    return fieldset_new 

#fields लाइन मूल क्षेत्रों पता चलता है: मैं ('जोड़ें' देखें) छवि पूर्वावलोकन (केवल क्षेत्रों पढ़ें) 'नए' फार्म से छिपाते हैं, लेकिन जब एक नई वस्तु को लाते समय उन्हें प्रदर्शित करने के लिए करना चाहता था। मैं मानता हूं कि यह समाधान बहुत 'ड्रवाई' नहीं है लेकिन यह स्पष्ट और सरल है। - एक इनलाइन फार्म पर, आप मुख्य obj, नहीं इनलाइन obj पारित कर रहे हैं

def get_fieldsets(self, request, obj=None): 
    def if_editing(*args): 
     return args if obj else() 
    return (
     (None, { 
      'classes': ('wide',), 
      'fields': if_editing('admin_thumb', 'admin_image',) + 
         ('original_image', 'user', 'supplier', 'customer', 'priority',)} 
     ), 
    ) 

ध्यान दें कि मुख्य रूप पर यह केवल काम करता है:

3

यहाँ कुशल समाधान की एक सूखी संस्करण है।

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