2012-12-11 10 views
18

मैं उन्हें स्पष्ट रूप से सूचीबद्ध किए बिना सभी फ़ील्ड को पढ़ने की कोशिश कर रहा हूं।Django व्यवस्थापक - सभी फ़ील्ड को पढ़ने के लिए

कुछ की तरह:

class CustomAdmin(admin.ModelAdmin): 
    def get_readonly_fields(self, request, obj=None): 
     if request.user.is_superuser: 
      return self.readonly_fields 

     return self.fields 

समस्या CustomAdmin.fields है इस बिंदु पर सेट नहीं है।

कोई विचार?

+0

कृपया इस लिंक पर http की जाँच: // stackoverflow। com/प्रश्न/4343535/Django-admin-बनाने-एक-क्षेत्र-केवल पढ़ने के लिए-जब संशोधित-obj बल्कि आवश्यक-जब जोड़ने उत्तरों की – Prateek

+0

कोई भी वहाँ मेरे सवाल का जवाब - "... उन्हें लिस्टिंग के बिना स्पष्ट रूप से " – yprez

+1

आशा इस एक में मदद करता है http://stackoverflow.com/questions/7920371/whole-model-as-read-only – Prateek

उत्तर

28

सावधान, self.model._meta.fields आवश्यक रूप से वही फ़ील्ड नहीं हैं जो CustomAdmin है!

"सभी व्यवस्थापक के क्षेत्र" और अधिक इस प्रकार दिखाई देगा:

from django.contrib import admin 
from django.contrib.admin.utils import flatten_fieldsets 

class CustomAdmin(admin.ModelAdmin): 
    def get_readonly_fields(self, request, obj=None): 
     if request.user.is_superuser: 
      return self.readonly_fields 

     if self.declared_fieldsets: 
      return flatten_fieldsets(self.declared_fieldsets) 
     else: 
      return list(set(
       [field.name for field in self.opts.local_fields] + 
       [field.name for field in self.opts.local_many_to_many] 
      )) 
+0

धन्यवाद यह बहुत अच्छा काम करता है। बस कई_to_many को हटा देना था क्योंकि यह अजीब दिखता है (वे किसी भी तरह से इनलाइन के रूप में पंजीकृत हैं और उनकी अपनी अनुमतियां हैं। यह 'model._meta' प्राप्त करने के बाद अधिक सुरक्षित लगता है। – yprez

+1

कोई चिंता नहीं। सावधान रहें यदि आपके पास कभी भी एम 2 एम है यह एक इनलाइन नहीं है। हालांकि इसे स्वयं को जाना चाहिए :-) –

+0

धन्यवाद। यह मुझे मिला सबसे उचित जवाब है। –

5

आप मॉडल मेटा क्षेत्रों के माध्यम से पुनरावृति सकता है:

def get_readonly_fields(self, request, obj=None): 
    if obj: 
     self.readonly_fields = [field.name for field in obj.__class__._meta.fields] 
    return self.readonly_fields 
+2

जब उपयोगकर्ता नई ऑब्जेक्ट बनाने का प्रयास करता है तो आपके यहां अपवाद है: obj .__ class __._ meta.fields – inoks

+1

@ लाइकिट, वास्तव में, अपडेट किया गया। –

+0

ठीक है, मैं अपने जवाब को हटाते हैं, क्या तुम सच में पहली बार था :) – inoks

14

ठीक है, अब वहाँ इस है:

class CustomAdmin(admin.ModelAdmin): 
    def get_readonly_fields(self, request, obj=None): 
     # ... 

     return [f.name for f in self.model._meta.fields] 

फिर भी एक कम बदसूरत रास्ता तलाश।

+1

कृपया डाउनवोट समझाएं। – yprez

+0

वास्तव में मुझे यह कहीं और मिला। और आपके उत्तर को ऊपर उठाने और इसे उस संस्करण में थोड़ा सा समायोजित करने के बाद मैंने अपने कोड में इस्तेमाल किया और परीक्षण किया। – yprez

+0

यदि क्लॉज आपके प्रश्न –

-1

get_fieldsets के साथ आप प्रपत्र

def get_readonly_fields(self, request, obj=None): 
    readonly = [] 
    for fs in self.get_fieldsets(request, obj): 
     if len(fs) > 1: 
      readonly += fs[1].get('fields', []) 
    return readonly 
+0

बुला' get_fieldsets() 'अंदर' get_readonly_fields() 'प्रत्यावर्तन सीमा क्षेत्र के लिए पहुंचता है :( –

5

से सभी क्षेत्रों inlines के लिए (Tab या ढेर)

मिल
def get_readonly_fields(self, request, obj=None): 
    fields = [] 
    for field in self.model._meta.get_all_field_names(): 
     if field != 'id': 
      fields.append(field) 
    return fields 

def has_add_permission(self, request): 
    return False 
+0

वापसी [क्षेत्र self.model._meta.get_all_field_names() में फ़ील्ड! = 'id'] ### धन्यवाद YPREZ –

1

यह मेरे लिए Django 1.10

के साथ काम किया
def get_readonly_fields(self, request, obj=None): 
    if request.user.is_superuser: 
     return self.readonly_fields 

    return list(set(
     [field.name for field in self.opts.local_fields] + 
     [field.name for field in self.opts.local_many_to_many] 
    )) 
0

मेरी आवश्यकता समान थी। मुझे केवल की आवश्यकता है केवल एक फ़ील्ड केवल पढ़ने के लिए दिखाया जाना चाहिए। और यह ठीक काम किया:

class ChoiceInline(admin.TabularInline): 
    model = Choice 
    extra = 1 
    fields = ['choice_text', 'votes'] 
    readonly_fields = ['votes'] 

class QuestionAdmin(admin.ModelAdmin): 
    #fields = ['pub_date', 'question_text'] 
    fieldsets = [ 
     (None, {'fields': ['question_text']}), 
     ('Date Information', {'fields': ['pub_date']}), 
    ] 
    search_fields = ['question_text'] 


    inlines = [ChoiceInline] 

देखें: C: \ Python27 \ लिब \ साइट-संकुल \ Django \ योगदान \ व्यवस्थापक \ options.py

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