2011-06-22 10 views
16

मुझे एक Django v1.2.4 एप्लिकेशन विरासत में मिला और कई सुधार और सुधार जोड़ने की प्रक्रिया में हूं। इस प्रक्रिया के दौरान, मैं अचानक निम्न त्रुटि का सामना करने के लिए शुरू किया:Django:% फ़िल्टर% द्वारा फ़िल्टरिंग की अनुमति नहीं है

SuspiciousOperation at 
/hometeam/admin/players/playeryear/ 

Filtering by team__season__season_start_date__year not allowed 

यह त्रुटि व्यवस्थापक इंटरफ़ेस पॉपअप में प्रदर्शित किया जाता है जब मैं (एक इनपुट फ़ील्ड के लिए एक आइटम क्षेत्रों के साथ जुड़े आवर्धक कांच के माध्यम से एक्सेस का चयन करने के लिए प्रयास करें)।

मैंने डीबगिंग चालू कर दी है, लेकिन मैं यह निर्धारित करने में असमर्थ हूं कि यह त्रुटि कहां हो रही है या हाल ही में किस बदलाव ने इसे शुरू किया है। क्या आप इस समस्या का कारण बन रहे गलती फ़िल्टर को ट्रैक करने के लिए डीबगिंग आउटपुट को सही तरीके से पार्स करने में मेरी सहायता कर सकते हैं?

class PlayerYearAdmin(FkAutocompleteAdmin): 
    related_search_fields = { 
     'team': ('school__school',), 
     'player': ('first_name', 'last_name'), 
    } 
    list_display = ['player', 'team', 'player_year_in_school'] 
    list_filter = ['team'] 
    search_fields = ['player__first_name', 'player__last_name'] 
    ordering = ['player__last_name', 'player__first_name'] 

list_display और list_filter बयान टिप्पणी करते हुए समस्या नहीं बदलता है:

खिलाड़ियों/admin.py निम्नलिखित वर्ग शामिल हैं।

नीचे कुछ डिबगिंग आउटपुट है। मैं आवश्यकतानुसार अधिक पोस्ट कर सकता हूं।

Request Method: GET 

Request URL: http://204.232.208.57:8010/hometeam/admin/players/playeryear/?team__season__season_start_date__year=2010&team__sport__sport=Boys%20Basketball&t=id&pop=1 

Django Version: 1.2.4 

Exception Type: SuspiciousOperation 

Exception Value: Filtering by team__season__season_start_date__year not allowed 

Exception Location: /usr/local/lib/python2.6/dist-packages/Django-1.2.4-py2.6.egg/django/contrib/admin/views/main.py in get_query_set, line 193 

Python Executable: /usr/bin/python 

मैं पहले से ही पैच https://code.djangoproject.com/changeset/15140 पर सुझाव लागू कर दिए हैं, लेकिन पैच के बाद कोई बदलाव नहीं किया गया था। किसी भी मार्गदर्शन की सराहना की जाएगी।

उत्तर

25

यह समस्या Chris Adams' blog पर दिए गए निर्देशों के अनुसार हल की गई है। Django 1.2.4 ने एक नई सुरक्षा सुविधा पेश की जो कि "answer में डैनियल रोज़मन द्वारा नोट किया गया" क्वेरीस्ट्रिंग के माध्यम से मनमानी क्रॉस-मॉडल लुकअप "का उपयोग करने की क्षमता सीमित करता है।

इस संस्करण के लिए वैकल्पिक हल FooAdmin में एक lookup_allowed विधि को परिभाषित करने के लिए है ('PlayerYearAdmin' मेरे मामले में) है कि फिल्टर के लिए सक्षम करना चाहते हैं के सभी के लिए सच देता है। मेरे मामले में, lookup_allowed इस तरह देखा:

def lookup_allowed(self, key): 
    if key in ('team__season__season_start_date__year', 'team__sport'): 
     return True 
    return super(PlayerYearAdmin, self).lookup_allowed(key) 

तुम भी पूरी तरह सुरक्षा जांच से बचने कर सकते हैं, प्रभावी ढंग से करते हुए कहा कि सभी लुकअप अनुमति दी जाती है।

def lookup_allowed(self, key): 
    return True 

ऐसा नहीं है कि संस्करण 1.2.5 added a third parameter, मूल्य, यह देखते हुए lookup_allowed के लायक हो सकता है: यह संस्करण 1.2.4 से पहले डिफ़ॉल्ट व्यवहार था। आप उस संस्करण का उपयोग कर रहे हैं, तो आप lookup_allowed इस तरह परिभाषित कर सकते हैं:

def lookup_allowed(self, key, value): 
    if key in ('team__season__season_start_date__year', 'team__sport'): 
     return True 
    return super(PlayerYearAdmin, self).lookup_allowed(key, value) 
+3

ग्रेट खोजें। धन्यवाद। – Cerin

1

release notes for 1.2.4 राज्य के रूप में, क्वेरीस्ट्रिंग के माध्यम से मनमानी क्रॉस-मॉडल लुकअप अब अनुमति नहीं है, क्योंकि वे एक सुरक्षा जोखिम हैं। वह पैच उन्हें पुनः सक्षम करने के लिए नहीं है।

आपको व्यवस्थापक की list_filter संपत्ति में स्पष्ट रूप से स्वीकृत संबंध निर्दिष्ट करने की आवश्यकता है। दुर्भाग्यवश, यह संस्करण 1.3 से ही संभव था, इसलिए आपको अपग्रेड करना होगा।

+0

मैं उन्नयन के बजाय गुमराह फिल्टर खोजने पसंद करेंगे। क्या आपके पास यह प्राप्त करने के बारे में कोई सुझाव है? –

+0

आपको एक कस्टम व्यवस्थापक टेम्पलेट में सबसे अधिक संभावना मिल जाएगी। –

+0

@chrisdpratt: एक अच्छा विचार है, लेकिन इस मामले में मैं कोई कस्टम व्यवस्थापक टेम्पलेट्स का उपयोग नहीं कर रहा हूं। –

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