2010-04-11 14 views
5

मान लें कि मेरे पास एक ऐसी साइट है जहां उपयोगकर्ता व्यवस्थापक पैनल के माध्यम से प्रविष्टियां जोड़ सकते हैं। प्रत्येक उपयोगकर्ता की अपनी श्रेणी होती है जिसके लिए वह ज़िम्मेदार होता है (प्रत्येक श्रेणी में फ़ोरिंगकी/कई टोमनीफिल्ड के माध्यम से असाइन किया गया संपादक होता है)।django व्यवस्थापक में changelist_view में queryset को फ़िल्टर करने के लिए कैसे?

जब उपयोगकर्ता प्रवेश कहते हैं, मैं इस तरह EntryAdmin का उपयोग करके विकल्पों को सीमित:

class EntryAdmin(admin.ModelAdmin): 
    (...) 

    def formfield_for_foreignkey(self, db_field, request, **kwargs): 
     if db_field.name == 'category': 
      if request.user.is_superuser: 
       kwargs['queryset'] = Category.objects.all() 
      else: 
       kwargs['queryset'] = Category.objects.filter(editors=request.user) 
      return db_field.formfield(**kwargs) 
     return super(EntryAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 

इस तरह से मैं एक उपयोगकर्ता प्रविष्टि जोड़ सकते हैं जो में श्रेणियां सीमित कर सकते हैं और यह सही काम करता है।

अब मुश्किल हिस्सा: प्रवेश परिवर्तक/क्रिया पृष्ठ पर मैं केवल उन प्रविष्टियों को दिखाना चाहता हूं जो मौजूदा उपयोगकर्ता की श्रेणी से संबंधित हैं। मैं इस पद्धति का उपयोग यह करने के लिए करने की कोशिश की:

def changelist_view(self, request, extra_context=None): 
     if not request.user.is_superuser: 
      self.queryset = self.queryset.filter(editors=request.user) 

लेकिन मैं इस त्रुटि मिलती है:

AttributeError: 'function' object has no attribute 'filter'

यह अजीब है, क्योंकि मैंने सोचा कि यह एक विशिष्ट क्वेरीसमूह होना चाहिए। असल में ऐसी विधियां not well documented हैं और डीजेगो कोड के माध्यम से खोदना मेरा पसंदीदा खेल नहीं है।

कोई विचार मैं अपना लक्ष्य कैसे प्राप्त कर सकता हूं?

उत्तर

12

querysetModelAdmin पर एक विधि है जो एक क्वेरीसेट देता है। आपको इसे अपने EntryAdmin कक्षा पर ओवरराइड करने की आवश्यकता है।

def queryset(self, request): 
    qs = super(EntryAdmin, self).queryset(request) 
    if request.user.is_superuser: 
     return qs 
    else: 
     return qs.filter(editors=request.user) 

क्वेरीसेट बदलने से सूची दृश्य में दिखाए गए प्रविष्टियों को सीमित कर दिया जाएगा। यह सुनिश्चित करने के लिए कि उपयोगकर्ता को ऑब्जेक्ट संपादन पृष्ठ पर ऑब्जेक्ट को संपादित करने की अनुमति है, आपको has_change_permission को ओवरराइड करने की भी आवश्यकता है। अधिक जानकारी के लिए जेम्स बेनेट ने निम्न ब्लॉग पोस्ट देखें:

http://www.b-list.org/weblog/2008/dec/24/admin/

+0

क्वेरीसमूह श्रेणी द्वारा फ़िल्टर किया जाना चाहिए। लेकिन एक समस्या है जब उपयोगकर्ता के पास एक से अधिक श्रेणियां असाइन की गई हैं। या शायद मैं कुछ याद कर रहा हूँ। – minder

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

  • कोई संबंधित समस्या नहीं^_^