2011-12-13 19 views
14

मैं Django व्यवस्थापक परिवर्तन सूची दृश्य के लिए एक कस्टम तर्क में पारित करने की कोशिश कर रहा हूं ताकि मैं सूची को एक विशेष तरीके से फ़िल्टर कर सकूं। मैं 'active_pp' नामक GET पैरामीटर के आधार पर क्वेरी फ़ील्ड को 2 फ़ील्ड्स, start_date और end_date पर फ़िल्टर करना चाहता हूं। मुझे फ़िल्टरिंग को सही तरीके से काम करने के लिए मिला है, लेकिन मैं एक जीईटी क्वेरी पैरामीटर में पास नहीं कर पा रहा हूं जो निर्दिष्ट करता है कि मुझे फ़िल्टर किए गए परिणाम या सामान्य परिणाम दिखाना चाहिए या नहीं।Django व्यवस्थापक कस्टम चेंज सूची तर्क: ओवरराइड /? ई = 1

मुझे पता है कि, सुरक्षा के कारण, Django व्यवस्थापक किसी भी क्वेरी पैरामीटर को फ़िल्टर करता है जो निर्दिष्ट मॉडल फ़ील्ड से संबंधित नहीं है; खराब तर्क खोजने पर, व्यवस्थापक उपयोगकर्ता को वर्तमान दृश्य में रीडायरेक्ट करता है लेकिन जीईटी क्वेरी पैरामीटर को ई = 1 के साथ बदल देता है। मैं अपने कस्टम 'active_pp' पैरामीटर को श्वेतसूची में रखना चाहता हूं, इसलिए पृष्ठ को पुनर्निर्देशित नहीं किया जाएगा और मैं पैरामीटर का उपयोग करने में सक्षम हूं।

यहां क्वेरीसेट अनुकूलन के साथ admin.py में ModelAdmin का एक उदाहरण है।

class FeaduredAdmin(admin.ModelAdmin): 

    .... 

    def get_changelist(self, request, **kwargs): 
     from django.contrib.admin.views.main import ChangeList 

     # Try to get the 'active_pp' query parameter 
     active_pp = request.GET.get('active_pp',None) 

     # Define a custom ChangeList class with a custom queryset 
     class ActiveChangeList(ChangeList): 
      def get_query_set(self, *args, **kwargs): 
       now = datetime.datetime.now() 
       qs = super(ActiveChangeList, self).get_query_set(*args, **kwargs) 
       return qs.filter((Q(start_date=None) | Q(start_date__lte=now)) 
          & (Q(end_date=None) | Q(end_date__gte=now))) 

     # use the custom ChangeList class if the parameter exists 
     if active_pp: 
      return ActiveChangeList 

     return ChangeList 

क्या कोई जानता है कि कस्टम GET क्वेरीस्ट्रिंग तर्कों को whit_ist में कैसे हटाया जाए?

पढ़ने के लिए और आपके विचार के लिए धन्यवाद, जो

अद्यतन:

Uvasal के दिए गए लिंक का उपयोग करना, मैं ठीक से प्राप्त पैरामीटर श्वेतसूची में सक्षम था।

class ActiveFilterAminForm(forms.Form): 
    active_pp = forms.CharField() 

class FeaduredAdmin(admin.ModelAdmin): 

    .... 

    # Based on: http://djangosnippets.org/snippets/2322/ 
    advanced_search_form = ActiveFilterAminForm() 

    def get_changelist(self, request, **kwargs): 

     from django.contrib.admin.views.main import ChangeList 
     active_pp = self.other_search_fields.get('active_pp',None) 
     # now we have the active_pp parameter that was passed in and can use it. 

     class ActiveChangeList(ChangeList): 

      def get_query_set(self, *args, **kwargs): 
       now = datetime.datetime.now() 
       qs = super(ActiveChangeList, self).get_query_set(*args, **kwargs) 
       return qs.filter((Q(start_date=None) | Q(start_date__lte=now)) 
           & (Q(end_date=None) | Q(end_date__gte=now))) 

     if not active_pp is None: 
      return ActiveChangeList 

     return ChangeList 


    def lookup_allowed(self, lookup): 
     if lookup in self.advanced_search_form.fields.keys(): 
      return True 
     return super(MyModelAdmin, self).lookup_allowed(lookup) 


    def changelist_view(self, request, extra_context=None, **kwargs): 
     self.other_search_fields = {} 
     asf = self.advanced_search_form 
     extra_context = {'asf':asf} 

     request.GET._mutable=True 

     for key in asf.fields.keys(): 
      try: 
       temp = request.GET.pop(key) 
      except KeyError: 
       pass 
      else: 
       if temp!=['']: 
        self.other_search_fields[key] = temp 

     request.GET_mutable=False 
     return super(FeaduredProductAdmin, self)\ 
       .changelist_view(request, extra_context=extra_context) 
+0

यह उचित DRY django समर्थन रखने के लिए उपयोगी उपयोगी सुविधा प्रतीत होता है। – dashesy

उत्तर

6

मैं तुम्हें बस के रूप में Advanced Search Django स्निपेट में उल्लिखित search_fields वर्ग चर में अपने कस्टम फ़िल्टर फ़ील्ड लगाने की जरूरत है लगता है।

आपको तारीख सीमाओं का समर्थन करने के लिए स्निपेट को संशोधित करने में सक्षम होना चाहिए।

+0

धन्यवाद उवासल। आपके द्वारा प्रदान किया गया लिंक वास्तव में मदद करता है। मैंने आपके द्वारा प्रदान किए गए प्रस्ताव के आधार पर कार्यान्वयन के साथ उपरोक्त कोड को अपडेट किया है। - जो –

3

संक्षेप में, यहाँ अप्रलेखित ऊपर उपयोग हैक है:

request.GET._mutable = True, तो request.GET.pop() सेट कस्टम प्राप्त तर्क (रों) प्रयोग कर रहे हैं बंद।

+0

नोटिस कि 'request.GET.pop (कुंजी) 'एक सूची प्राप्त करें – WeizhongTu

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